Compare commits

...

48 Commits

Author SHA1 Message Date
3djc cca7180834 Release prep 2017-12-17 10:07:54 +01:00
Bertrand Songis 104ab8c7f3 Typo fix
Because omeone asked to to explain what means LDC today ...
2017-12-16 22:09:38 +01:00
Bertrand Songis e4d273aa0e Update CREDITS.txt 2017-12-16 17:12:32 +01:00
Bertrand Songis df61a1ab4e Update CREDITS.txt 2017-12-16 17:11:01 +01:00
Raphael Coeffic 1dcd8cc419 small fixes for french translation (#5517)
* fixed VKEYS french

fixes #5481

* fix french confirmation popup

fixes #5475
2017-12-16 15:42:26 +01:00
Max Paperno b55b68f191 [Companion] Fix incorrect Settings dialog tab shown by default (closes #5511). 2017-12-15 19:15:14 -05:00
3djc 2c2339e229 Merge pull request #5514 from opentx/bsongis/r9m_navigation_issue
R9M navigation issue (when external module is R9M-EU and internal mod…
2017-12-14 15:35:40 +01:00
Bertrand Songis d7645252bb Power issue with R9M (always max power) (#5513) 2017-12-14 15:34:14 +01:00
3djc dc89bb1dfc Fix SHUTDOWN_CONFIRMATION compile 2017-12-14 07:58:31 +01:00
Bertrand Songis 47383fd053 Update CREDITS.txt 2017-12-13 22:15:32 +01:00
Bertrand Songis f80406c7cb R9M navigation issue (when external module is R9M-EU and internal module is OFF) 2017-12-13 22:13:40 +01:00
3djc 75b382e619 Simply hide unavailable choices (#5509) 2017-12-13 12:51:01 +01:00
Bertrand Songis 566c616abb Update CREDITS.txt 2017-12-13 09:18:47 +01:00
Arne Schwabe 59d2ef8aa1 Rework rssi code a bit (#5507)
* Switch backlight on when displaying a warning.

This is especially visible on the power off RSSI warning. This will also show the other warnings at start with backlight, even when blocklight is set to always off. But my X9D+ will switch its backlight on after boot once even with backlight on, so backlight=off is not so off as it seems.

* Rework power rssi code a bit

- Cleanup shutdown_confirm code
- allow x9d+ to be compiled as power button too to be able to test these things on the x9d+
- Fix shutoff after 10s in warning dialog on x9d
- Make warning dialog always turn on backlight

* Revert CMakeLists.txt
2017-12-12 22:01:32 +01:00
3djc 977262232a Better handle interactions with internal module telemetry (#5506) 2017-12-12 20:32:53 +01:00
Bertrand Songis fa5895de39 Update CREDITS.txt 2017-12-11 19:27:40 +01:00
Sebastien Charpentier f2fb788eac Fixed some typo. (#5499) 2017-12-11 18:12:04 +01:00
Max Paperno c8c3b79f2d [X10] Accept old OTX_FOURCC for X12 as valid when reading data. (#5497) 2017-12-11 13:05:40 +01:00
Bertrand Songis 1c7012726a FourCC added for X10 (last minute change, not tested at all (#5495)
FourCC added for X10
2017-12-10 20:23:59 +01:00
Arne Schwabe e3bbbdcecf Fix compiler warning is Russian tts 2017-12-10 13:00:03 +01:00
Max Paperno 4e8867c819 [Companion] Include global functions and function source types in conversions. 2017-12-10 06:21:17 -05:00
Max Paperno cffb5e767f [Companion] Ensure proper number of model slots after radio data conversion. 2017-12-10 06:10:26 -05:00
Max Paperno 204711d313 [Companion] Fix possible out-of-bounds array access crash. 2017-12-10 06:05:41 -05:00
Max Paperno e43807540e [Companion] Adjust X10/S hardware options to match radio (no L1/L2/JSx/JSy). Fixes #5488 (#5493) 2017-12-10 10:09:24 +01:00
Bertrand Songis eb79d4f774 Update CREDITS.txt 2017-12-10 10:02:05 +01:00
Bertrand Songis e80b63f66f Update CREDITS.txt 2017-12-09 22:09:04 +01:00
Kilrah ada0712e1a French translations 2017-12-09 11:53:35 +01:00
3djc 0a7aece40f Inc SDCard version for RC2 2017-12-09 10:32:26 +01:00
3djc 63bcb4693d Merge pull request #5485 from opentx/LapinFou/Update_Wizard
Updated Wizard
2017-12-09 10:30:46 +01:00
Max Paperno dec630efa0 [X9] Allow LSs 33-64 in main view & fix X9E view of channels 17-32 (#5486)
* [212x64] Main view toggle LS groups 1-32 and 33-64 with +/-/encoder. Closes #5476

* [212x64] Also allow encoder events in channels view for switching channels range (fix for X9E).

* Pad LS range numerals to 2 digits.
2017-12-09 10:20:07 +01:00
Sebastien Charpentier 2a0984408f Updated French Translation (#5484)
* Initial version

* Updated French Translation.
2017-12-09 10:19:06 +01:00
3djc 8e5027dcb2 Better support for R9M EU (#5487)
* POC for X9, requires -DBINDING_OPTIONS=YES

* There are apparently 4 valid choices

* - make BINDING_OPTIONS part of standard code
- adapt R9M EU LBT dialog to choice on bind

* - remove option from Companion
- cosmetics

* Compilation fixes
2017-12-09 10:17:56 +01:00
3djc f489742c9e Fix German compilation 2017-12-09 09:23:54 +01:00
LapinFou bcc6e3c67d Updated Wizard: reduced mixers name to 6 caracters. 2017-12-08 16:53:18 +01:00
3djc 12ad7b0d9c Reorganize ana display for X7 (#5482) 2017-12-08 11:27:37 +01:00
Bertrand Songis a6044a684d Bsongis/r9 m fixes (#5406)
R9M support
2017-12-08 11:26:46 +01:00
Max Paperno 9c27947345 [Companion] Ensure no duplicates in recent files menu (thanks capitaineflam25). Fixes #5336 (#5478) 2017-12-08 09:26:01 +01:00
Max Paperno c96a30aea0 [Companion] Fix GVar min corrupted when upgrading from firmware <= v217 (fixes #5466). (#5477) 2017-12-08 09:25:22 +01:00
Raphael Coeffic 934578118b added support for min/max contrast to eeprom interface and use it (#5473)
Added support for min/max contrast to eeprom interface and use it. Fixes #5468
2017-12-07 22:10:24 +01:00
3djc 81dbebb663 Show multi failsafe to x7 UI (#5471)
* Show multi failsafe to x7 UI

* Cosmetics

* Fix also horus ui and remove useless ifs
2017-12-07 18:49:55 +01:00
Arne Schwabe afd3103506 Update multi protocols (#5461)
* Update multi protocols

* SFHSS also has failsafe implemented

* Show failsafe setting in Companion

* Fix missing protocol names

* Update failsafe format and only show bind when module reports to support it
2017-12-07 18:48:10 +01:00
Raphael Coeffic 8b34c96a2d fixed switch direction in X10 simulator (#5472) 2017-12-07 18:41:49 +01:00
Bertrand Songis ec2c4302cb Update CREDITS.txt 2017-12-07 18:12:07 +01:00
Alexander Novikov 23eeccec9c Ru tts (#5456)
Russian TTS
2017-12-05 20:02:10 +01:00
Bertrand Songis 421f16d0dd Update CREDITS.txt 2017-12-05 18:08:35 +01:00
Bertrand Songis cb73261c60 Update CREDITS.txt 2017-12-04 23:18:10 +01:00
Arne Schwabe 6bc02fd838 Add sane defaults for X10/X12. Also set battery warnings when creating general settings in simulator/companion (#5465) 2017-12-04 21:17:02 +01:00
3djc a7e4b0b062 Post RC1 fixes 2017-12-04 16:53:10 +01:00
76 changed files with 2476 additions and 1421 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ set(VERSION_REVISION "1")
set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX})
set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR})
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX})
set(SDCARD_REVISION "0012")
set(SDCARD_REVISION "0013")
set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION})
cmake_minimum_required(VERSION 2.8)
+12
View File
@@ -1289,3 +1289,15 @@ Merv Dale
Michel Garbarino
Geoff Graham
Georges Pezet
Robert Wilhelm
Francis Herzog
Bo Hjeresen
Danny Koch
John Eppling
Thierry Malosse
Johann Antretter
Jan Kaiser
Rachel Berkhahn
Luca Massimiliano Comolli
Mario Wesierski
Evening Shade Pottery
+1 -1
View File
@@ -45,7 +45,7 @@
</sizepolicy>
</property>
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="profileTab">
<attribute name="title">
+17 -16
View File
@@ -172,37 +172,29 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
switch (capability) {
case Sticks:
return 4;
case Pots:
if (IS_HORUS(board))
return 3;
else if (IS_TARANIS_X7(board))
if (IS_TARANIS_X7(board))
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
else if (IS_TARANIS(board))
return 3;
else
return 3;
case Sliders:
if (IS_HORUS(board))
if (IS_HORUS_X12S(board) || IS_TARANIS_X9E(board))
return 4;
else if (IS_TARANIS_X7(board))
return 0;
else if (IS_TARANIS_X9E(board))
return 4;
else if (IS_TARANIS(board))
else if (IS_TARANIS_X9D(board) || IS_HORUS_X10(board))
return 2;
else
return 0;
case MouseAnalogs:
if (IS_HORUS(board))
if (IS_HORUS_X12S(board))
return 2;
else
return 0;
case FactoryInstalledSwitches:
if (IS_TARANIS_X9E(board))
return 8;
// no break
case Switches:
if (IS_TARANIS_X9E(board))
return 18;
@@ -212,16 +204,25 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
return 8;
else
return 7;
case FactoryInstalledSwitches:
if (IS_TARANIS_X9E(board))
return 8;
else
return getCapability(board, Switches);
case SwitchPositions:
if (IS_HORUS_OR_TARANIS(board))
return getCapability(board, Switches) * 3;
else
return 9;
case NumTrims:
if (IS_HORUS(board))
return 6;
else
return 4;
case NumTrimSwitches:
return getCapability(board, NumTrims) * 2;
}
+25 -4
View File
@@ -1178,7 +1178,6 @@ GeneralSettings::GeneralSettings()
memset(this, 0, sizeof(GeneralSettings));
contrast = 25;
vBatWarn = 90;
for (int i=0; i < CPN_MAX_ANALOGS; ++i) {
calibMid[i] = 0x200;
@@ -1189,7 +1188,29 @@ GeneralSettings::GeneralSettings()
Firmware * firmware = Firmware::getCurrentVariant();
Board::Type board = firmware->getBoard();
for (int i=0; i<getBoardCapability(board, Board::FactoryInstalledSwitches); i++) {
// vBatWarn is voltage in 100mV, vBatMin is in 100mV but with -9V offset, vBatMax has a -12V offset
vBatWarn = 90;
if (IS_TARANIS_X9E(board) || IS_HORUS_X12S(board)) {
// NI-MH 9.6V
vBatWarn = 87;
vBatMin = -5; //8,5V
vBatMax = -5; //11,5V
}
else if (IS_HORUS_X10(board)) {
// Lipo 2V
vBatWarn = 66;
vBatMin = -28; // 6.2V
vBatMax = -38; // 8.2V
}
else if (IS_TARANIS(board)) {
// NI-MH 7.2V, X9D, X9D+ and X7
vBatWarn = 65;
vBatMin = -30; //6V
vBatMax = -40; //8V
}
for (int i=0; i<getBoardCapability(board, Board::FactoryInstalledSwitches); i++) {
switchConfig[i] = Boards::getSwitchInfo(board, i).config;
}
@@ -1219,13 +1240,13 @@ GeneralSettings::GeneralSettings()
potConfig[2] = Board::POT_WITHOUT_DETENT;
}
if (IS_HORUS(board) || IS_TARANIS_X9E(board)) {
if (IS_HORUS_X12S(board) || IS_TARANIS_X9E(board)) {
sliderConfig[0] = Board::SLIDER_WITH_DETENT;
sliderConfig[1] = Board::SLIDER_WITH_DETENT;
sliderConfig[2] = Board::SLIDER_WITH_DETENT;
sliderConfig[3] = Board::SLIDER_WITH_DETENT;
}
else if (IS_TARANIS(board) && !IS_TARANIS_X7(board)) {
else if (IS_TARANIS_X9(board) || IS_HORUS_X10(board)) {
sliderConfig[0] = Board::SLIDER_WITH_DETENT;
sliderConfig[1] = Board::SLIDER_WITH_DETENT;
}
+2
View File
@@ -69,6 +69,8 @@ enum Capability {
SoundMod,
SoundPitch,
MaxVolume,
MaxContrast,
MinContrast,
Haptic,
HasBeeper,
ModelTrainerEnable,
@@ -3227,15 +3227,16 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
for (int i=0; i<MAX_GVARS(board, version); i++) {
if (version >= 218) {
internalField.Append(new ZCharField<3>(this, modelData.gvarData[i].name, "GVar name"));
internalField.Append(new SignedField<12>(this, modelData.gvarData[i].min));
internalField.Append(new SignedField<12>(this, modelData.gvarData[i].max));
internalField.Append(new UnsignedField<12>(this, (unsigned &)modelData.gvarData[i].min));
internalField.Append(new UnsignedField<12>(this, (unsigned &)modelData.gvarData[i].max));
internalField.Append(new BoolField<1>(this, modelData.gvarData[i].popup));
internalField.Append(new UnsignedField<1>(this, modelData.gvarData[i].prec));
internalField.Append(new UnsignedField<2>(this, modelData.gvarData[i].unit));
internalField.Append(new SpareBitsField<4>(this));
}
else {
internalField.Append(new ZCharField<6>(this, modelData.gvarData[i].name, "GVar name"));
internalField.Append(new ZCharField<3>(this, modelData.gvarData[i].name, "GVar name"));
internalField.Append(new SpareBitsField<3*8>(this));
if (version >= 216) {
internalField.Append(new BoolField<1>(this, modelData.gvarData[i].popup));
internalField.Append(new SpareBitsField<7>(this));
@@ -3522,8 +3523,8 @@ void OpenTxModelData::afterImport()
modelData.moduleData[module].pxx.power = pxxByte & 0x03;
modelData.moduleData[module].pxx.receiver_telem_off = static_cast<bool>(pxxByte & (1 << 4));
modelData.moduleData[module].pxx.receiver_channel_9_16 = static_cast<bool>(pxxByte & (1 << 5));
modelData.moduleData[module].pxx.external_antenna = modelData.moduleData[module].ppm.outputType;
modelData.moduleData[module].pxx.sport_out = modelData.moduleData[module].ppm.pulsePol;
modelData.moduleData[module].pxx.sport_out = modelData.moduleData[module].ppm.outputType;
modelData.moduleData[module].pxx.external_antenna = modelData.moduleData[module].ppm.pulsePol;
}
}
@@ -337,7 +337,7 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
}
for (int i = 0; i < getCurrentFirmware()->getCapability(Models); i++) {
if (!radioData.models[i].isEmpty()) {
if (i < (int)radioData.models.size() && !radioData.models[i].isEmpty()) {
OpenTxModelData generator((ModelData &)radioData.models[i], board, version, variant);
// generator.Dump();
QByteArray data;
@@ -543,6 +543,16 @@ int OpenTxFirmware::getCapability(::Capability capability)
return 0;
case MaxVolume:
return (IS_ARM(board) ? 23 : 7);
case MaxContrast:
if (IS_TARANIS_X7(board))
return 30;
else
return 45;
case MinContrast:
if (IS_TARANIS_X9(board))
return 0;
else
return 10;
case HasSoundMixer:
return (IS_ARM(board) ? 1 : 0);
case ExtraInputs:
@@ -749,7 +759,7 @@ QString OpenTxFirmware::getAnalogInputName(unsigned int index)
};
return CHECK_IN_ARRAY(pots, index);
}
else if (IS_HORUS(board)) {
else if (IS_HORUS_X12S(board)) {
const QString pots[] = {
QObject::tr("S1"),
QObject::tr("6P"),
@@ -763,6 +773,16 @@ QString OpenTxFirmware::getAnalogInputName(unsigned int index)
};
return CHECK_IN_ARRAY(pots, index);
}
else if (IS_HORUS_X10(board)) {
const QString pots[] = {
QObject::tr("S1"),
QObject::tr("6P"),
QObject::tr("S2"),
QObject::tr("LS"),
QObject::tr("RS")
};
return CHECK_IN_ARRAY(pots, index);
}
else {
return "???";
}
@@ -1133,7 +1153,6 @@ void addOpenTxFrskyOptions(OpenTxFirmware * firmware)
firmware->addOption("nogvars", QObject::tr("Disable Global variables"));
firmware->addOption("lua", QObject::tr("Enable Lua custom scripts screen"));
firmware->addOption("luac", QObject::tr("Enable Lua compiler"));
firmware->addOption("bindopt", QObject::tr("Enable bindings options"));
}
void addOpenTxTaranisOptions(OpenTxFirmware * firmware)
+3 -1
View File
@@ -31,7 +31,6 @@ ui(new Ui::GeneralSetup)
QSlider *tpmsld[] = {ui->chkSA, ui->chkSB, ui->chkSC, ui->chkSD, ui->chkSE, ui->chkSF, ui->chkSG, ui->chkSH, NULL};
if (IS_TARANIS(firmware->getBoard())) {
ui->contrastSB->setMinimum(0);
if (firmware->getId().contains("readonly")) {
uint16_t switchstate = generalSettings.switchUnlockStates;
ui->chkSA->setValue(switchstate & 0x3);
@@ -216,7 +215,10 @@ ui(new Ui::GeneralSetup)
populateRotEncCB(reCount);
}
ui->contrastSB->setMinimum(firmware->getCapability(MinContrast));
ui->contrastSB->setMaximum(firmware->getCapability(MaxContrast));
ui->contrastSB->setValue(generalSettings.contrast);
ui->battwarningDSB->setValue((double)generalSettings.vBatWarn/10);
ui->backlightautoSB->setValue(generalSettings.backlightDelay*5);
ui->inactimerSB->setValue(generalSettings.inactivityTimer);
+4 -4
View File
@@ -1414,11 +1414,11 @@ void MdiChild::setCurrentFile(const QString & fileName)
isUntitled = false;
setWindowModified(false);
updateTitle();
int MaxRecentFiles = g.historySize();
QStringList files = g.recentFiles();
files.removeAll(fileName);
files.prepend(fileName);
while (files.size() > MaxRecentFiles)
files.removeAll(curFile);
files.prepend(curFile);
while (files.size() > g.historySize())
files.removeLast();
g.recentFiles(files);
}
+43 -32
View File
@@ -172,6 +172,7 @@ void TimerPanel::on_name_editingFinished()
#define MASK_MULTIOPTION 512
#define MASK_R9M 1024
#define MASK_SBUSPPM_FIELDS 2048
#define MASK_SUBTYPES 4096
quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT;
@@ -369,7 +370,7 @@ void ModulePanel::update()
mask |= MASK_PROTOCOL;
switch (protocol) {
case PULSES_PXX_R9M:
mask |= MASK_R9M;
mask |= MASK_R9M | MASK_SUBTYPES;
case PULSES_PXX_XJT_X16:
case PULSES_PXX_XJT_D8:
case PULSES_PXX_XJT_LR12:
@@ -402,7 +403,7 @@ void ModulePanel::update()
mask |= MASK_SBUSPPM_FIELDS| MASK_CHANNELS_RANGE;
break;
case PULSES_MULTIMODULE:
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_MULTIMODULE;
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_MULTIMODULE | MASK_SUBTYPES;
max_rx_num = 15;
if (module.multi.rfProtocol == MM_RF_PROTO_DSM2)
mask |= MASK_CHANNELS_COUNT;
@@ -410,6 +411,8 @@ void ModulePanel::update()
module.channelsCount = 16;
if (multiProtocols.getProtocol(module.multi.rfProtocol).optionsstr != nullptr)
mask |= MASK_MULTIOPTION;
if (multiProtocols.getProtocol(module.multi.rfProtocol).hasFailsafe)
mask |= MASK_FAILSAFES;
break;
case PULSES_OFF:
break;
@@ -466,37 +469,49 @@ void ModulePanel::update()
ui->antennaMode->setVisible(mask & MASK_ANTENNA);
ui->antennaMode->setCurrentIndex(module.pxx.external_antenna);
// R9M S.port output
// R9M options
ui->sportOut->setVisible(mask & MASK_R9M);
ui->label_sportOut->setVisible(mask & MASK_R9M);
ui->sportOut->setCurrentIndex(module.pxx.sport_out);
ui->r9mPower->setVisible((mask & MASK_R9M) && module.subType == 0);
ui->label_r9mPower->setVisible((mask & MASK_R9M) && module.subType == 0);
if (mask & MASK_R9M) {
if (model->moduleData[0].protocol >= PULSES_PXX_XJT_X16 && model->moduleData[0].protocol <= PULSES_PXX_XJT_LR12) {
module.pxx.sport_out = false;
ui->sportOut->setDisabled(true);
}
else {
ui->sportOut->setEnabled(true);
}
ui->sportOut->setChecked(module.pxx.sport_out);
ui->r9mPower->setCurrentIndex(module.pxx.power);
}
ui->r9mPower->setVisible(mask & MASK_R9M);
ui->label_r9mPower->setVisible(mask & MASK_R9M);
ui->r9mPower->setCurrentIndex(module.pxx.power);
// module subtype
ui->label_multiSubType->setVisible(mask & MASK_SUBTYPES);
ui->multiSubType->setVisible(mask & MASK_SUBTYPES);
if (mask & MASK_SUBTYPES) {
unsigned numEntries = 2; // R9M FCC/EU
if (mask & MASK_MULTIMODULE)
numEntries = (module.multi.customProto ? 8 : multiProtocols.getProtocol(module.multi.rfProtocol).numSubytes());
const QSignalBlocker blocker(ui->multiSubType);
ui->multiSubType->clear();
for (unsigned i=0; i < numEntries; i++)
ui->multiSubType->addItem(ModelPrinter::printModuleSubType(protocol, i, module.multi.rfProtocol, module.multi.customProto), i);
ui->multiSubType->setCurrentIndex(module.subType);
}
// Multi settings fields
ui->label_multiProtocol->setVisible(mask & MASK_MULTIMODULE);
ui->multiProtocol->setVisible(mask & MASK_MULTIMODULE);
ui->multiProtocol->setCurrentIndex(module.multi.rfProtocol);
ui->label_multiSubType->setVisible(mask & MASK_MULTIMODULE);
ui->multiSubType->setVisible(mask & MASK_MULTIMODULE);
ui->label_option->setVisible(mask & MASK_MULTIOPTION);
ui->optionValue->setVisible(mask & MASK_MULTIOPTION);
ui->autoBind->setVisible(mask & MASK_MULTIMODULE);
ui->lowPower->setVisible(mask & MASK_MULTIMODULE);
if (mask & MASK_MULTIMODULE) {
int numEntries = multiProtocols.getProtocol(module.multi.rfProtocol).numSubytes();
if (module.multi.customProto)
numEntries=8;
// Removes extra items
ui->multiSubType->setMaxCount(numEntries);
for (int i=0; i < numEntries; i++) {
if (i < ui->multiSubType->count())
ui->multiSubType->setItemText(i, ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i));
else
ui->multiSubType->addItem(ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i), (QVariant) i);
}
ui->multiProtocol->setCurrentIndex(module.multi.rfProtocol);
ui->autoBind->setChecked(module.multi.autoBindMode ? Qt::Checked : Qt::Unchecked);
ui->lowPower->setChecked(module.multi.lowPowerMode ? Qt::Checked : Qt::Unchecked);
}
if (mask & MASK_MULTIOPTION) {
@@ -506,14 +521,8 @@ void ModulePanel::update()
ui->optionValue->setValue(module.multi.optionValue);
ui->label_option->setText(qApp->translate("Multiprotocols", qPrintable(pdef.optionsstr)));
}
ui->multiSubType->setCurrentIndex(module.subType);
ui->autoBind->setVisible(mask & MASK_MULTIMODULE);
ui->autoBind->setChecked(module.multi.autoBindMode ? Qt::Checked : Qt::Unchecked);
ui->lowPower->setVisible(mask & MASK_MULTIMODULE);
ui->lowPower->setChecked(module.multi.lowPowerMode ? Qt::Checked : Qt::Unchecked);
// Failsafes
ui->label_failsafeMode->setVisible(mask & MASK_FAILSAFES);
ui->failsafeMode->setVisible(mask & MASK_FAILSAFES);
@@ -582,10 +591,12 @@ void ModulePanel::on_antennaMode_currentIndexChanged(int index)
emit modified();
}
void ModulePanel::on_sportOut_currentIndexChanged(int index)
void ModulePanel::on_sportOut_toggled(bool checked)
{
module.pxx.sport_out = index;
emit modified();
if (module.pxx.sport_out != checked) {
module.pxx.sport_out = checked;
emit modified();
}
}
void ModulePanel::on_r9mPower_currentIndexChanged(int index)
+1 -1
View File
@@ -88,7 +88,7 @@ class ModulePanel : public ModelPanel
void on_multiSubType_currentIndexChanged(int index);
void on_autoBind_stateChanged(int state);
void on_lowPower_stateChanged(int state);
void on_sportOut_currentIndexChanged(int index);
void on_sportOut_toggled(bool checked);
void on_r9mPower_currentIndexChanged(int index);
void setChannelFailsafeValue(const int channel, const int value, quint8 updtSb = 0);
void onFailsafeComboIndexChanged(int index);
+177 -184
View File
@@ -6,13 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>674</width>
<height>229</height>
<width>708</width>
<height>259</height>
</rect>
</property>
<property name="windowTitle">
<string/>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
@@ -147,22 +150,43 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_multiSubType">
<widget class="QLabel" name="label_rxNumber">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>SubType</string>
<string>Receiver No.</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="multiSubType">
<widget class="QSpinBox" name="rxNumber">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
<property name="suffix">
<string/>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>63</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
@@ -206,87 +230,53 @@
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_antenna">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<widget class="QLabel" name="label_r9mPower">
<property name="text">
<string>Antenna</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<string>RF Output Power</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="antennaMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<widget class="QComboBox" name="r9mPower">
<item>
<property name="text">
<string>Internal</string>
<string>10 mW</string>
</property>
</item>
<item>
<property name="text">
<string>Ext. + Int.</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_ppmOutputType">
<property name="text">
<string>Output type</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="ppmOutputType">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<item>
<property name="text">
<string>Open Drain</string>
<string>100 mW</string>
</property>
</item>
<item>
<property name="text">
<string>Push Pull</string>
<string>500 mW</string>
</property>
</item>
<item>
<property name="text">
<string>1000 mW</string>
</property>
</item>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="optionValue">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_option">
<property name="text">
<string>Option value</string>
</property>
</widget>
<item row="4" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="autoBind">
<property name="text">
<string>Bind on startup</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="lowPower">
<property name="text">
<string>Low Power</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
@@ -352,61 +342,6 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_rxNumber">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Receiver No.</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="rxNumber">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="suffix">
<string/>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>63</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="autoBind">
<property name="text">
<string>Bind on startup</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="lowPower">
<property name="text">
<string>Low Power</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_ppmDelay">
<property name="maximumSize">
<size>
@@ -422,7 +357,7 @@
</property>
</widget>
</item>
<item row="3" column="1">
<item row="1" column="1">
<widget class="QSpinBox" name="ppmDelay">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
@@ -450,7 +385,7 @@
</property>
</widget>
</item>
<item row="4" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_ppmFrameLength">
<property name="maximumSize">
<size>
@@ -466,7 +401,7 @@
</property>
</widget>
</item>
<item row="4" column="1">
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="ppmFrameLength">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
@@ -494,6 +429,89 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_antenna">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Antenna</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="antennaMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<item>
<property name="text">
<string>Internal</string>
</property>
</item>
<item>
<property name="text">
<string>Ext. + Int.</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_ppmOutputType">
<property name="text">
<string>Output type</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="ppmOutputType">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<item>
<property name="text">
<string>Open Drain</string>
</property>
</item>
<item>
<property name="text">
<string>Push Pull</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_option">
<property name="text">
<string>Option value</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="optionValue">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
@@ -560,6 +578,26 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_multiSubType">
<property name="text">
<string>Sub Type</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="multiSubType">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_failsafeMode">
<property name="maximumSize">
<size>
@@ -575,7 +613,7 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="4" column="1">
<widget class="QComboBox" name="failsafeMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
@@ -613,7 +651,7 @@
</item>
</widget>
</item>
<item row="3" column="0">
<item row="5" column="0">
<widget class="QLabel" name="label_trainerMode">
<property name="maximumSize">
<size>
@@ -629,7 +667,7 @@
</property>
</widget>
</item>
<item row="3" column="1">
<item row="5" column="1">
<widget class="QComboBox" name="trainerMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
@@ -667,64 +705,19 @@
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_sportOut">
<item row="3" column="1">
<widget class="QCheckBox" name="sportOut">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>S.port output</string>
<string>Module Telemetry</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="sportOut">
<property name="currentText">
<string>Disable</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<item>
<property name="text">
<string>Disable</string>
</property>
</item>
<item>
<property name="text">
<string>Enable</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_r9mPower">
<property name="text">
<string>RF Output Power</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="r9mPower">
<item>
<property name="text">
<string>10 mW</string>
</property>
</item>
<item>
<property name="text">
<string>100 mW</string>
</property>
</item>
<item>
<property name="text">
<string>500 mW</string>
</property>
</item>
<item>
<property name="text">
<string>1000 mW</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="3">
+47 -4
View File
@@ -45,6 +45,14 @@ ModelPrinter::~ModelPrinter()
{
}
QString ModelPrinter::printBoolean(bool val)
{
if (val)
return tr("Y");
else
return tr("N");
}
void debugHtml(const QString & html)
{
QFile file("foo.html");
@@ -132,7 +140,7 @@ QString ModelPrinter::printMultiRfProtocol(int rfProtocol, bool custom)
static const char *strings[] = {
"FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023",
"Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","OLRS",
"FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002"
"FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "CABELL", "Esky 150", "H8 3D"
};
if (custom)
return "Custom - proto " + QString::number(rfProtocol);
@@ -140,7 +148,7 @@ QString ModelPrinter::printMultiRfProtocol(int rfProtocol, bool custom)
return CHECK_IN_ARRAY(strings, rfProtocol);
}
QString ModelPrinter::printMultiSubType(int rfProtocol, bool custom, unsigned int subType) {
QString ModelPrinter::printMultiSubType(unsigned rfProtocol, bool custom, unsigned int subType) {
/* custom protocols */
if (custom)
@@ -154,6 +162,39 @@ QString ModelPrinter::printMultiSubType(int rfProtocol, bool custom, unsigned in
return "???";
}
QString ModelPrinter::printR9MPowerValue(unsigned subType, unsigned val, bool telem)
{
static const QStringList strFTC = QStringList() << tr("10mW") << tr("100mW") << tr("500mW") << tr("1W");
static const QStringList strLBT = QStringList() << tr("25mW") << tr("500mW");
if (subType == 0 && (int)val < strFTC.size())
return strFTC.at(val);
else if (subType == 1)
return (telem ? strLBT.at(0) : strLBT.at(1));
else
return "???";
}
QString ModelPrinter::printModuleSubType(unsigned protocol, unsigned subType, unsigned rfProtocol, bool custom)
{
static const char * strings[] = {
"FCC",
"LBT(EU)"
};
switch (protocol) {
case PULSES_MULTIMODULE:
return printMultiSubType(rfProtocol, custom, subType);
case PULSES_PXX_R9M:
return CHECK_IN_ARRAY(strings, subType);
default:
return "???";
}
}
QString ModelPrinter::printModule(int idx) {
const ModuleData &module = model.moduleData[idx];
if (module.protocol == PULSES_OFF)
@@ -167,6 +208,8 @@ QString ModelPrinter::printModule(int idx) {
}
if (module.protocol == PULSES_MULTIMODULE)
result += " " + tr("radio Protocol %1, subType %2, option value %3").arg(printMultiRfProtocol(module.multi.rfProtocol, module.multi.customProto)).arg(printMultiSubType(module.multi.rfProtocol, module.multi.customProto, module.subType)).arg(module.multi.optionValue);
else if (module.protocol == PULSES_PXX_R9M)
result += " " + tr("Module Type: %1, Power: %2, Telemetry Enabled: %3").arg(printModuleSubType(module.protocol, module.subType)).arg(printR9MPowerValue(module.subType, module.pxx.power, module.pxx.sport_out)).arg(printBoolean(module.pxx.sport_out));
return result;
}
}
@@ -709,7 +752,7 @@ QString ModelPrinter::printGlobalVarMax(int idx)
QString ModelPrinter::printGlobalVarPopup(int idx)
{
return (model.gvarData[idx].popup ? "Y" : "N" );
return printBoolean(model.gvarData[idx].popup);
}
QString ModelPrinter::printOutputValueGVar(int val)
@@ -760,6 +803,6 @@ QString ModelPrinter::printOutputCurve(int idx)
QString ModelPrinter::printOutputSymetrical(int idx)
{
return (model.limitData[idx].symetrical ? "Y": "N");
return printBoolean(model.limitData[idx].symetrical);
}
+4 -1
View File
@@ -54,12 +54,15 @@ class ModelPrinter: public QObject
ModelPrinter(Firmware * firmware, const GeneralSettings & generalSettings, const ModelData & model);
virtual ~ModelPrinter();
QString printBoolean(bool val);
QString printEEpromSize();
QString printTrimIncrementMode();
QString printThrottleTrimMode();
static QString printModuleProtocol(unsigned int protocol);
static QString printMultiRfProtocol(int rfProtocol, bool custom);
static QString printMultiSubType(int rfProtocol, bool custom, unsigned int subType);
static QString printR9MPowerValue(unsigned subType, unsigned val, bool telem);
static QString printMultiSubType(unsigned rfProtocol, bool custom, unsigned int subType);
static QString printModuleSubType(unsigned protocol, unsigned subType, unsigned rfProtocol = 0, bool custom = false);
QString printFlightModeSwitch(const RawSwitch & swtch);
QString printFlightModeName(int index);
QString printFlightModes(unsigned int flightModes);
+9 -5
View File
@@ -45,8 +45,8 @@ static const QStringList STR_SUBTYPE_YD717 {"YD717", "Skywalker", "Syma X2", "
static const QStringList STR_SUBTYPE_SYMAX {"Standard", "Syma X5C"};
static const QStringList STR_SUBTYPE_SLT {"SLT", "Vista"};
static const QStringList STR_SUBTYPE_CX10 {"Green", "Blue", "DM007", "-", "JC3015a", "JC3015b", "MK33041", "Q242"};
static const QStringList STR_SUBTYPE_CG023 {"CG023", "YD829", "H8 3D"};
static const QStringList STR_SUBTYPE_BAYANG {"Bayang", "H8S3D", "X16 AH"};
static const QStringList STR_SUBTYPE_CG023 {"CG023", "YD829"};
static const QStringList STR_SUBTYPE_BAYANG {"Bayang", "H8S3D", "X16 AH", "IRDRONE"};
static const QStringList STR_SUBTYPE_KN {"WLtoys", "FeiLun"};
static const QStringList STR_SUBTYPE_MT99 {"MT99", "H7", "YZ", "LS", "FY805"};
static const QStringList STR_SUBTYPE_MJXQ {"WLH08", "X600", "X800", "H26D", "E010", "H26WH"};
@@ -56,6 +56,8 @@ static const QStringList STR_SUBTYPE_AFHDS2A {"PWM and IBUS", "PPM and IBUS", "P
static const QStringList STR_SUBTYPE_Q2X2 {"Q222", "Q242", "Q282"};
static const QStringList STR_SUBTYPE_WK2x01 {"WK2801", "WK2401", "W6_5_1", "W6_6_1", "W6_HEL", "W6_HEL_I"};
static const QStringList STR_SUBTYPE_Q303 {"Q303", "CX35", "CX10D", "CX10WD"};
static const QStringList STR_SUBTYPE_CABELL {"CABELL V3","C TELEM","-","-","-","-","F_SAFE","UNBIND"};
static const QStringList STR_SUBTYPE_H83D {"H8_3D","H20H","H20Mini","H30Mini"};
static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT};
@@ -73,18 +75,20 @@ const Multiprotocols multiProtocols {
{MM_RF_PROTO_SYMAX, 1, false, STR_SUBTYPE_SYMAX, nullptr},
{MM_RF_PROTO_SLT, 1, false, STR_SUBTYPE_SLT, nullptr},
{MM_RF_PROTO_CX10, 7, false, STR_SUBTYPE_CX10, nullptr},
{MM_RF_PROTO_CG023, 2, false, STR_SUBTYPE_CG023, nullptr},
{MM_RF_PROTO_BAYANG, 2, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY},
{MM_RF_PROTO_CG023, 1, false, STR_SUBTYPE_CG023, nullptr},
{MM_RF_PROTO_BAYANG, 3, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY},
{MM_RF_PROTO_MT99XX, 4, false, STR_SUBTYPE_MT99, nullptr},
{MM_RF_PROTO_MJXQ, 5, false, STR_SUBTYPE_MJXQ, nullptr},
{MM_RF_PROTO_FY326, 1, false, STR_SUBTYPE_FY326, nullptr},
{MM_RF_PROTO_SFHSS, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MM_RF_PROTO_SFHSS, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MM_RF_PROTO_HONTAI, 2, false, STR_SUBTYPE_HONTAI, nullptr},
{MM_RF_PROTO_OLRS, 0, false, NO_SUBTYPE, STR_MULTI_RFPOWER},
{MM_RF_PROTO_FS_AFHDS2A, 3, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ},
{MM_RF_PROTO_Q2X2, 2, false, STR_SUBTYPE_Q2X2, nullptr},
{MM_RF_PROTO_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr},
{MM_RF_PROTO_Q303, 3, false, STR_SUBTYPE_Q303, nullptr},
{MM_RF_PROTO_CABELL, 7, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION},
{MM_RF_PROTO_H83D, 3, false, STR_SUBTYPE_H83D, nullptr},
{MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION},
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
+21
View File
@@ -168,6 +168,8 @@ void LogicalSwitchData::convert(Board::Type before, Board::Type after)
void CustomFunctionData::convert(Board::Type before, Board::Type after)
{
swtch.convert(before, after);
if (func == FuncVolume || func == FuncPlayValue || (func >= FuncAdjustGV1 && func <= FuncAdjustGVLast && adjustMode == 1))
param = RawSource(param).convert(before, after).toValue();
}
void FlightModeData::convert(Board::Type before, Board::Type after)
@@ -203,6 +205,10 @@ void GeneralSettings::convert(Board::Type before, Board::Type after)
{
// Here we can add explicit conversions when moving from one board to another
for (int i=0; i<CPN_MAX_SPECIAL_FUNCTIONS; i++) {
customFn[i].convert(before, after);
}
// No SE and SG on X7 board
if (IS_TARANIS_X7(after)) {
if (IS_TARANIS_X9(before) || IS_HORUS(before)) {
@@ -212,6 +218,16 @@ void GeneralSettings::convert(Board::Type before, Board::Type after)
memcpy(switchName[5], switchName[7], sizeof(switchName[5]));
}
}
if (IS_TARANIS(after)) {
unsigned int min_contrast = getCurrentFirmware()->getCapability(MinContrast);
unsigned int max_contrast = getCurrentFirmware()->getCapability(MaxContrast);
if (contrast < min_contrast)
contrast = min_contrast;
else if (contrast > max_contrast)
contrast = max_contrast;
}
}
@@ -297,4 +313,9 @@ void RadioData::convert(Board::Type before, Board::Type after)
if (IS_HORUS(after)) {
fixModelFilenames();
}
// ensure proper number of model slots
if (getCurrentFirmware()->getCapability(Models) && getCurrentFirmware()->getCapability(Models) != (int)models.size()) {
models.resize(getCurrentFirmware()->getCapability(Models));
}
}
+4 -1
View File
@@ -812,7 +812,10 @@ enum MultiModuleRFProtocols {
MM_RF_PROTO_Q303,
MM_RF_PROTO_GW008,
MM_RF_PROTO_DM002,
MM_RF_PROTO_LAST=MM_RF_PROTO_DM002
MM_RF_PROTO_CABELL,
MM_RF_PROTO_ESKY150,
MM_RF_PROTO_H83D,
MM_RF_PROTO_LAST=MM_RF_PROTO_H83D
};
enum TrainerProtocol {
+2 -1
View File
@@ -71,8 +71,9 @@ class StorageFormat
{
switch (board) {
case Board::BOARD_X12S:
case Board::BOARD_X10:
return 0x3478746F;
case Board::BOARD_X10:
return 0x3778746F;
case Board::BOARD_TARANIS_X7:
return 0x3678746F;
case Board::BOARD_TARANIS_X9E:
File diff suppressed because it is too large Load Diff
@@ -422,15 +422,15 @@ local function createModel(event)
if(AilFields[1][5] == 1) then
addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail")
elseif (AilFields[1][5] == 2) then
addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail1")
addMix(AilFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail2", -100)
addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilL")
addMix(AilFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilR", -100)
end
-- Flaps
if(FlapsFields[1][5] == 1) then
addMix(FlapsFields[2][5], MIXSRC_SA, "Flaps")
elseif (FlapsFields[1][5] == 2) then
addMix(FlapsFields[2][5], MIXSRC_SA, "Flaps1")
addMix(FlapsFields[3][5], MIXSRC_SA, "Flaps2")
addMix(FlapsFields[2][5], MIXSRC_SA, "FlapsL")
addMix(FlapsFields[3][5], MIXSRC_SA, "FlapsR")
end
-- Tail
if(TailFields[1][5] == 0) then
@@ -439,14 +439,14 @@ local function createModel(event)
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev")
addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder")
elseif (TailFields[1][5] == 2) then
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev1")
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevL")
addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder")
addMix(TailFields[4][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev2")
addMix(TailFields[4][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevR")
elseif (TailFields[1][5] == 3) then
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "VTailE", 50)
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "VTailR", 50, 1)
addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "VTailE", 50)
addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "VTailR", -50, 1)
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleL", 50)
addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudL", 50, 1)
addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleR", 50)
addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudR", -50, 1)
end
lcd.drawText(70, 90, "Model successfully created !", TEXT_COLOR)
lcd.drawText(100, 130, "Press RTN to exit", TEXT_COLOR)
@@ -1,3 +1,19 @@
---- #########################################################################
---- # #
---- # Copyright (C) OpenTX #
-----# #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
---- # #
---- # This program is free software; you can redistribute it and/or modify #
---- # it under the terms of the GNU General Public License version 2 as #
---- # published by the Free Software Foundation. #
---- # #
---- # This program is distributed in the hope that it will be useful #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
---- # GNU General Public License for more details. #
---- # #
---- #########################################################################
-- Delta Wizard pages
local ENGINE_PAGE = 0
local ELEVONS_PAGE = 1
@@ -1,3 +1,19 @@
---- #########################################################################
---- # #
---- # Copyright (C) OpenTX #
-----# #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
---- # #
---- # This program is free software; you can redistribute it and/or modify #
---- # it under the terms of the GNU General Public License version 2 as #
---- # published by the Free Software Foundation. #
---- # #
---- # This program is distributed in the hope that it will be useful #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
---- # GNU General Public License for more details. #
---- # #
---- #########################################################################
-- Multicopter Wizard pages
local THROTTLE_PAGE = 0
local ROLL_PAGE = 1
@@ -1,3 +1,19 @@
---- #########################################################################
---- # #
---- # Copyright (C) OpenTX #
-----# #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
---- # #
---- # This program is free software; you can redistribute it and/or modify #
---- # it under the terms of the GNU General Public License version 2 as #
---- # published by the Free Software Foundation. #
---- # #
---- # This program is distributed in the hope that it will be useful #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
---- # GNU General Public License for more details. #
---- # #
---- #########################################################################
-- Plane Wizard pages
local ENGINE_PAGE = 0
local AILERONS_PAGE = 1
@@ -166,7 +182,7 @@ local function engineMenu(event)
end
-- Ailerons Menu
local aileronsModeItems = {"No", "Yes", "Yes, 2 channels"}
local aileronsModeItems = {"No", "Yes, 1 channel", "Yes, 2 channels"}
local function drawAileronsMenu()
lcd.clear()
if aileronsMode == 2 then
@@ -211,7 +227,7 @@ local function aileronsMenu(event)
end
-- Flaps Menu
local flapsModeItems = {"No", "Yes", "Yes, 2 channels"}
local flapsModeItems = {"No", "Yes, 1 channel", "Yes, 2 channels"}
local function drawFlapsMenu()
lcd.clear()
if flapsMode == 0 then
@@ -256,7 +272,7 @@ local function flapsMenu(event)
end
-- Airbrakes Menu
local brakesModeItems = {"No", "Yes", "Yes, 2 channels"}
local brakesModeItems = {"No", "Yes, 1 channel", "Yes, 2 channels"}
local function drawBrakesMenu()
lcd.clear()
if brakesMode == 0 then
@@ -1,3 +1,19 @@
---- #########################################################################
---- # #
---- # Copyright (C) OpenTX #
-----# #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
---- # #
---- # This program is free software; you can redistribute it and/or modify #
---- # it under the terms of the GNU General Public License version 2 as #
---- # published by the Free Software Foundation. #
---- # #
---- # This program is distributed in the hope that it will be useful #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
---- # GNU General Public License for more details. #
---- # #
---- #########################################################################
-- Navigation variables
local dirty = true
@@ -308,10 +308,10 @@ local function applySettings()
if engineMode == 1 then
addMix(thrCH1, MIXSRC_FIRST_INPUT+defaultChannel(2), "Engine")
end
addMix(elevCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevL-E", 50)
addMix(elevCH1, MIXSRC_FIRST_INPUT+defaultChannel(3), "ElevL-A", 50, 1)
addMix(elevCH2, MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevR-E", 50)
addMix(elevCH2, MIXSRC_FIRST_INPUT+defaultChannel(3), "ElevR-A", -50, 1)
addMix(elevCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "D-EleL", 50)
addMix(elevCH1, MIXSRC_FIRST_INPUT+defaultChannel(3), "D-AilL", 50, 1)
addMix(elevCH2, MIXSRC_FIRST_INPUT+defaultChannel(1), "D-EleR", 50)
addMix(elevCH2, MIXSRC_FIRST_INPUT+defaultChannel(3), "D-AilR", -50, 1)
if rudderMode == 1 then
addMix(rudCH1, MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder")
end
@@ -265,7 +265,7 @@ end
local function applySettings()
model.defaultInputs()
model.deleteMixes()
addMix(thrCH1, MIXSRC_FIRST_INPUT+defaultChannel(2), "Throttle")
addMix(thrCH1, MIXSRC_FIRST_INPUT+defaultChannel(2), "Engine")
addMix(rollCH1, MIXSRC_FIRST_INPUT+defaultChannel(3), "Roll")
addMix(yawCH1, MIXSRC_FIRST_INPUT+defaultChannel(0), "Yaw")
addMix(pitchCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "Pitch")
@@ -1,4 +1,3 @@
---- #########################################################################
---- # #
---- # Copyright (C) OpenTX #
@@ -186,7 +185,7 @@ local function engineMenu(event)
end
-- Ailerons Menu
local aileronsModeItems = {"No", "Yes", "Yes, 2 channels"}
local aileronsModeItems = {"No", "Yes, 1 channel", "Yes, 2 channels"}
local function drawAileronsMenu()
lcd.clear()
lcd.drawText(1, 0, "Has your model got ailerons?", 0)
@@ -233,7 +232,7 @@ local function aileronsMenu(event)
end
-- Flaps Menu
local flapsModeItems = {"No", "Yes", "Yes, 2 channels"}
local flapsModeItems = {"No", "Yes, 1 channel", "Yes, 2 channels"}
local function drawFlapsMenu()
lcd.clear()
lcd.drawText(1, 0, "Has your model got flaps?", 0)
@@ -280,7 +279,7 @@ local function flapsMenu(event)
end
-- Airbrakes Menu
local brakesModeItems = {"No", "Yes", "Yes, 2 channels"}
local brakesModeItems = {"No", "Yes, 1 channel", "Yes, 2 channels"}
local function drawBrakesMenu()
lcd.clear()
lcd.drawText(1, 0, "Has your model got air brakes?", 0)
@@ -327,7 +326,7 @@ local function brakesMenu(event)
end
-- Tail Menu
local tailModeItems = {"Ele(1ch)", "Ele(1ch) + Rudder(1ch)", "Ele(2ch) + Rudder(1ch)", "V-Tail(2ch)"}
local tailModeItems = {"Ele(1ch)", "Ele(1ch) + Rud(1ch)", "Ele(2ch) + Rud(1ch)", "V-Tail(2ch)"}
local function drawTailMenu()
lcd.clear()
lcd.drawText(1, 0, "Which is the tail config on your model?", 0)
@@ -462,7 +461,7 @@ local function drawConfirmationMenu()
end
if flapsMode == 1 then
x, y = drawNextLine(x, y, "Flaps", flapsCH1)
elsif flapsMode == 2 then
elseif flapsMode == 2 then
x, y = drawNextLine(x, y, "Flap L", flapsCH1)
x, y = drawNextLine(x, y, "Flap R", flapsCH2)
end
@@ -510,35 +509,35 @@ local function applySettings()
if aileronsMode == 1 then
addMix(ailCH1, MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail")
elseif aileronsMode == 2 then
addMix(ailCH1, MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail L")
addMix(ailCH2, MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail R", -100)
addMix(ailCH1, MIXSRC_FIRST_INPUT+defaultChannel(3), "AilL")
addMix(ailCH2, MIXSRC_FIRST_INPUT+defaultChannel(3), "AilR", -100)
end
if flapsMode == 1 then
addMix(flapsCH1, MIXSRC_SA, "Flaps")
elseif flapsMode == 2 then
addMix(flapsCH1, MIXSRC_SA, "Flap L")
addMix(flapsCH2, MIXSRC_SA, "Flap R")
addMix(flapsCH1, MIXSRC_SA, "FlapL")
addMix(flapsCH2, MIXSRC_SA, "FlapR")
end
if brakesMode == 1 then
addMix(brakesCH1, MIXSRC_SE, "Brakes")
elseif brakesMode == 2 then
addMix(brakesCH1, MIXSRC_SE, "Brake L")
addMix(brakesCH2, MIXSRC_SE, "Brake R")
addMix(brakesCH1, MIXSRC_SE, "BrakeL")
addMix(brakesCH2, MIXSRC_SE, "BrakeR")
end
if tailMode == 3 then
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "V-Ele L", 50)
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(0), "V-Rud L", 50, 1)
addMix(eleCH2, MIXSRC_FIRST_INPUT+defaultChannel(1), "V-Ele R", 50)
addMix(eleCH2, MIXSRC_FIRST_INPUT+defaultChannel(0), "V-Rud R", -50, 1)
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleL", 50)
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudL", 50, 1)
addMix(eleCH2, MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleR", 50)
addMix(eleCH2, MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudR", -50, 1)
else
if tailMode > 0 then
addMix(rudCH1, MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder")
end
if tailMode == 1 then
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "Elevator")
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev")
elseif tailMode == 2 then
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev L")
addMix(eleCH2, MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev R")
addMix(eleCH1, MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevL")
addMix(eleCH2, MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevR")
end
end
end
+1 -1
View File
@@ -103,7 +103,7 @@ end
-- Redraw the current page
local function redrawFieldsPage()
lcd.clear()
lcd.drawScreenTitle("S6R", page, #pages)
lcd.drawScreenTitle("SxR", page, #pages)
if refreshIndex < #fields then
drawProgressBar()
+1 -6
View File
@@ -3,7 +3,7 @@ include(Bitmaps)
set(PCB_TYPES X7 X9D X9D+ X9E X10 X12S 9X 9XR 9X128 9XR128 9X2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO AR9X)
set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL)
set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU)
set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU RU)
set(PCB "X9D+" CACHE STRING "Radio type, one of: ${PCB_TYPES}")
set_property(CACHE PCB PROPERTY STRINGS ${PCB_TYPES})
@@ -41,7 +41,6 @@ option(FAS_PROTOTYPE "Support of old FAS prototypes (different resistors)" OFF)
option(TEMPLATES "Model templates menu" OFF)
option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON)
option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF)
option(BINDING_OPTIONS "Allow advanced frsky bindings" OFF)
option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF)
option(NANO "Use nano newlib and binalloc")
option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF)
@@ -327,10 +326,6 @@ if(TRACE_LUA_INTERNALS)
add_definitions(-DTRACE_LUA_INTERNALS_ENABLED)
endif()
if(BINDING_OPTIONS)
add_definitions(-DBINDING_OPTIONS)
endif()
if(FRSKY_STICKS)
add_definitions(-DFRSKY_STICKS)
endif()
+7 -7
View File
@@ -654,7 +654,7 @@ PACK(struct ModuleData {
int8_t rfProtocol:4;
uint8_t channelsStart;
int8_t channelsCount; // 0=8 channels
uint8_t failsafeMode:4; //only 3 bits used
uint8_t failsafeMode:4; // only 3 bits used
uint8_t subType:3;
uint8_t invertedSerial:1; // telemetry serial inverted from standard
int16_t failsafeChannels[MAX_OUTPUT_CHANNELS];
@@ -667,23 +667,23 @@ PACK(struct ModuleData {
} ppm;
NOBACKUP(struct {
uint8_t rfProtocolExtra:2;
uint8_t spare:3;
uint8_t spare1:3;
uint8_t customProto:1;
uint8_t autoBindMode:1;
uint8_t lowPowerMode:1;
int8_t optionValue;
} multi);
NOBACKUP(struct {
uint8_t power:2; // 0 10 mW, 1 100 mW, 2 500 mW, 3 1W
uint8_t spare:2;
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W
uint8_t spare1:2;
uint8_t receiver_telem_off:1; // false = receiver telem enabled
uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16
uint8_t external_antenna:1; // false = internal antenna, true = external antenna
uint8_t external_antenna:1; // false = internal antenna, true = external antenna
uint8_t sport_out:1;
uint8_t spare3;
uint8_t spare2;
} pxx);
NOBACKUP(struct {
uint8_t spare:6;
uint8_t spare1:6;
uint8_t noninverted:1;
uint8_t spare2:1;
int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms)
+151 -91
View File
@@ -143,7 +143,7 @@ enum MenuModelSetupItems {
#endif
#define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0)
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0
#define CURSOR_ON_CELL (true)
#define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX)
@@ -178,33 +178,56 @@ enum MenuModelSetupItems {
#define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? HEADER_LINE+ITEM_MODEL_SETUP_MAX : HEADER_LINE+ITEM_MODEL_SETUP_MAX-1)
#endif
#if defined(BINDING_OPTIONS)
#if defined(PCBTARANIS)
void onBindMenu(const char * result)
{
if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition);
if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else {
return;
}
moduleFlag[INTERNAL_MODULE] = MODULE_BIND;
moduleFlag[moduleIdx] = MODULE_BIND;
}
#endif
void menuModelSetup(event_t event)
{
#if defined(PCBX7)
@@ -711,6 +734,8 @@ void menuModelSetup(event_t event)
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (IS_MODULE_DSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0));
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -735,6 +760,8 @@ void menuModelSetup(event_t event)
case 1:
if (IS_MODULE_DSM2(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT);
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -747,7 +774,8 @@ void menuModelSetup(event_t event)
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
} else {
}
else {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
}
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
@@ -771,13 +799,13 @@ void menuModelSetup(event_t event)
{
lcdDrawTextAlignedLeft(y, STR_SUBTYPE);
uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true);
const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_rfProto);
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_rfProto);
if (multi_rfProto == MM_RF_CUSTOM_SELECTED) {
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2);
} else
{
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2);
}
else {
if (pdef->subTypeString != nullptr)
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, attr);
}
@@ -796,7 +824,7 @@ void menuModelSetup(event_t event)
}
}
}
break;
break;
#endif
#if defined(PCBX7)
@@ -987,26 +1015,40 @@ void menuModelSetup(event_t event)
s_editMode=0;
}
#endif
#if defined(BINDING_OPTIONS)
#if defined(PCBTARANIS)
if (attr && l_posHorz > 0) {
if (s_editMode > 0) {
if (l_posHorz == 1) {
if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) {
if(event==EVT_KEY_BREAK(KEY_ENTER)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1));
if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) {
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
uint8_t default_selection;
if (IS_MODULE_R9M_LBT(moduleIdx)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF);
if (!IS_TELEMETRY_INTERNAL_MODULE())
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF);
default_selection = 2;
}
else {
if (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE))
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
if (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE))
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
default_selection = g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1);
}
POPUP_MENU_SELECT_ITEM(default_selection);
POPUP_MENU_START(onBindMenu);
continue;
}
if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) {
if (moduleFlag[moduleIdx] == MODULE_BIND) {
newFlag = MODULE_BIND;
}
else {
if (!popupMenuNoItems) {
s_editMode=0; // this is when popup is exited before a choice is made
s_editMode = 0; // this is when popup is exited before a choice is made
}
}
}
@@ -1027,7 +1069,6 @@ void menuModelSetup(event_t event)
newFlag = MODULE_RANGECHECK;
}
#endif
moduleFlag[moduleIdx] = newFlag;
#if defined(MULTIMODULE)
@@ -1059,40 +1100,40 @@ void menuModelSetup(event_t event)
case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: {
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
ModuleData &moduleData = g_model.moduleData[moduleIdx];
if (IS_MODULE_PXX(moduleIdx)) {
lcdDrawTextAlignedLeft(y, STR_FAILSAFE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 ? attr : 0);
if (moduleData.failsafeMode == FAILSAFE_CUSTOM)
lcdDrawText(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition == 1 ? attr : 0);
if (attr) {
if (moduleData.failsafeMode != FAILSAFE_CUSTOM)
menuHorizontalPosition = 0;
if (menuHorizontalPosition == 0) {
if (editMode > 0 || p1valdiff) {
CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST);
if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx);
}
} else if (menuHorizontalPosition == 1) {
s_editMode = 0;
if (moduleData.failsafeMode == FAILSAFE_CUSTOM && event == EVT_KEY_FIRST(KEY_ENTER)) {
g_moduleIdx = moduleIdx;
pushMenu(menuModelFailsafe);
}
} else {
lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN, 8);
lcdDrawTextAlignedLeft(y, STR_FAILSAFE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 ? attr : 0);
if (moduleData.failsafeMode == FAILSAFE_CUSTOM)
lcdDrawText(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition == 1 ? attr : 0);
if (attr) {
if (moduleData.failsafeMode != FAILSAFE_CUSTOM)
menuHorizontalPosition = 0;
if (menuHorizontalPosition == 0) {
if (editMode > 0 || p1valdiff) {
CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST);
if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx);
}
} else if (menuHorizontalPosition == 1) {
s_editMode = 0;
if (moduleData.failsafeMode == FAILSAFE_CUSTOM && event == EVT_KEY_FIRST(KEY_ENTER)) {
g_moduleIdx = moduleIdx;
pushMenu(menuModelFailsafe);
}
} else {
lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN, 8);
}
}
}
break;
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: {
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
#if defined(MULTIMODULE)
if (IS_MODULE_MULTIMODULE(moduleIdx)) {
int optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true);
const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_proto);
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto);
if (pdef->optionsstr)
lcdDrawTextAlignedLeft(y, pdef->optionsstr);
@@ -1103,21 +1144,33 @@ void menuModelSetup(event_t event)
if (attr) {
if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70);
} else if (multi_proto == MM_RF_PROTO_OLRS) {
}
else if (multi_proto == MM_RF_PROTO_OLRS) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7);
} else {
}
else {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
}
}
}
#endif
if (IS_MODULE_R9M(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE) {
lcdDrawTextAlignedLeft(y, STR_SPORT_OUT);
if (IS_MODULE_R9M_FCC(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event);
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEMETRY, attr, event);
}
}
else if (IS_MODULE_R9M_LBT(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_BINDING_OPTION);
}
}
else if (IS_MODULE_SBUS(moduleIdx)) {
@@ -1126,44 +1179,51 @@ void menuModelSetup(event_t event)
}
break;
}
case ITEM_MODEL_EXTERNAL_MODULE_POWER: {
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
case ITEM_MODEL_EXTERNAL_MODULE_POWER:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
if (IS_MODULE_R9M_FCC(moduleIdx)) {
// Power selection is only available on R9M FCC
lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr);
if (attr)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX);
}
#if defined(MULTIMODULE)
if (IS_MODULE_MULTIMODULE(moduleIdx)) {
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
}
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
}
#endif
if (IS_MODULE_R9M(moduleIdx)) {
lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr);
if (attr)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3);
}
}
break;
break;
#if defined(MULTIMODULE)
case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND:
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event);
else
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
break;
case ITEM_MODEL_EXTERNAL_MODULE_STATUS: {
lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS);
case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND:
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event);
else
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
break;
char statusText[64];
multiModuleStatus.getStatusString(statusText);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText);
break;
}
case ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS: {
lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC);
case ITEM_MODEL_EXTERNAL_MODULE_STATUS: {
lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS);
char statusText[64];
multiSyncStatus.getRefreshString(statusText);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText);
break;
}
char statusText[64];
multiModuleStatus.getStatusString(statusText);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText);
break;
}
case ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS: {
lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC);
char statusText[64];
multiSyncStatus.getRefreshString(statusText);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText);
break;
}
#endif
#endif
+2
View File
@@ -92,6 +92,8 @@ void showAlertBox(const pm_char * title, const pm_char * text, const char * acti
lcdRefresh();
lcdSetContrast();
clearKeyEvents();
backlightOn();
checkBacklight();
}
void runPopupWarning(event_t event)
+22 -5
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
*
@@ -51,16 +51,23 @@ void menuRadioDiagKeys(event_t event)
if (i < 6) {
y = MENU_HEADER_HEIGHT + FH + FH*i;
#if defined(PCBX7)
if (i > 1) {
lcdDrawTextAtIndex(0, y, STR_VKEYS, (5-i), 0);
displayKeyState(5*FW+4, y, KEY_MENU+(5-i));
}
#else
lcdDrawTextAtIndex(0, y, STR_VKEYS, (5-i), 0);
displayKeyState(5*FW+2, y, KEY_MENU+(5-i));
#endif
}
#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, y, sw, 0);
drawSwitch(8*FW+4, y, sw, 0);
}
}
#else
@@ -74,12 +81,22 @@ void menuRadioDiagKeys(event_t event)
#if defined(ROTARY_ENCODER_NAVIGATION)
for (uint8_t i=0; i<DIM(rotencValue); i++) {
#if defined(PCBX7)
coord_t y = MENU_HEADER_HEIGHT + FH;
coord_t x = 6*FW+3;
lcdDrawTextAtIndex(0, MENU_HEADER_HEIGHT + FH , STR_VRENCODERS, i, 0);
#else
coord_t y = MENU_HEADER_HEIGHT /* ??? + 1 ??? */ + i*FH;
coord_t x = 19*FW;
lcdDrawTextAtIndex(14*FW, y, STR_VRENCODERS, i, 0);
#endif
#if defined(ROTARY_ENCODERS)
lcdDrawNumber(18*FW, y, rotencValue[i], LEFT|(keyState(BTN_REa+i) ? INVERS : 0));
lcdDrawNumber(x, y, rotencValue[i], LEFT|(keyState(BTN_REa+i) ? INVERS : 0));
#elif defined(PCBX7)
lcdDrawNumber(x, y, rotencValue[i], RIGHT);
#else
lcdDrawNumber(18*FW, y, rotencValue[i], LEFT);
lcdDrawNumber(x, y, rotencValue[i], LEFT);
#endif
}
#endif
+128 -78
View File
@@ -103,32 +103,54 @@ enum MenuModelSetupItems {
#define MODEL_SETUP_RANGE_OFS 7*FW
#define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2
#if defined(BINDING_OPTIONS)
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
void onBindMenu(const char * result)
{
if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition);
if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else {
return;
}
moduleFlag[INTERNAL_MODULE] = MODULE_BIND;
moduleFlag[moduleIdx] = MODULE_BIND;
}
#endif
void copySelection(char * dst, const char * src, uint8_t size)
{
@@ -219,8 +241,6 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
}
}
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
int getSwitchWarningsCount()
{
int count = 0;
@@ -253,7 +273,7 @@ int getSwitchWarningsCount()
#define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#if TIMERS == 1
#define TIMERS_ROWS TIMER_ROWS(0)
@@ -306,8 +326,11 @@ void menuModelSetup(event_t event)
EXTERNAL_MODULE_MODE_ROWS,
MULTIMODULE_STATUS_ROWS
EXTERNAL_MODULE_CHANNELS_ROWS,
((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol))|| IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW,
FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW,
((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW,
FAILSAFE_ROWS(EXTERNAL_MODULE),
EXTERNAL_MODULE_OPTION_ROW,
MULTIMODULE_MODULE_ROWS
EXTERNAL_MODULE_POWER_ROW,
LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS});
#endif
MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX);
@@ -741,6 +764,8 @@ void menuModelSetup(event_t event)
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (IS_MODULE_DSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0));
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -775,6 +800,8 @@ void menuModelSetup(event_t event)
case 1:
if (IS_MODULE_DSM2(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT);
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -787,7 +814,8 @@ void menuModelSetup(event_t event)
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
} else {
}
else {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
}
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
@@ -807,8 +835,9 @@ void menuModelSetup(event_t event)
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) {
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL));
break;
} else {
const mm_protocol_definition* pdef = getMultiProtocolDefinition(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false));
}
else {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false));
if (pdef->maxSubtype > 0)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, pdef->maxSubtype);
}
@@ -967,11 +996,11 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM);
}
if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) {
if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (xOffsetBind)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && l_posHorz==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx));
if (checkIncDec_Ret) {
modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx];
}
@@ -986,29 +1015,42 @@ void menuModelSetup(event_t event)
#if defined(MULTIMODULE)
if (multiBindStatus == MULTI_BIND_FINISHED) {
multiBindStatus = MULTI_NORMAL_OPERATION;
s_editMode=0;
s_editMode = 0;
}
#endif
#if defined(BINDING_OPTIONS)
if (attr && l_posHorz>0) {
if(s_editMode>0) {
if (s_editMode>0) {
if (l_posHorz == 1) {
if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) {
if(event==EVT_KEY_BREAK(KEY_ENTER)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1));
if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) {
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
uint8_t default_selection;
if (IS_MODULE_R9M_LBT(moduleIdx)) {
if (!IS_TELEMETRY_INTERNAL_MODULE())
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF);
default_selection = 1;
}
else {
if (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE))
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
if (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE))
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1);
}
POPUP_MENU_SELECT_ITEM(default_selection);
POPUP_MENU_START(onBindMenu);
continue;
}
if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) {
if (moduleFlag[moduleIdx] == MODULE_BIND) {
newFlag = MODULE_BIND;
}
else {
if (!popupMenuNoItems) {
s_editMode=0; // this is when popup is exited before a choice is made
s_editMode = 0; // this is when popup is exited before a choice is made
}
}
}
@@ -1019,13 +1061,6 @@ void menuModelSetup(event_t event)
else if (l_posHorz == 2) {
newFlag = MODULE_RANGECHECK;
}
#else
if (attr && l_posHorz>0 && s_editMode>0) {
if (l_posHorz == 1)
newFlag = MODULE_BIND;
else if (l_posHorz == 2) {
newFlag = MODULE_RANGECHECK;
#endif
}
}
moduleFlag[moduleIdx] = newFlag;
@@ -1042,37 +1077,37 @@ void menuModelSetup(event_t event)
case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) {
ModuleData & moduleData = g_model.moduleData[moduleIdx];
lcdDrawTextAlignedLeft(y, STR_FAILSAFE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0);
if (moduleData.failsafeMode == FAILSAFE_CUSTOM) lcdDrawText(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition==1 ? attr : 0);
if (attr) {
if (moduleData.failsafeMode != FAILSAFE_CUSTOM) {
menuHorizontalPosition = 0;
ModuleData & moduleData = g_model.moduleData[moduleIdx];
lcdDrawTextAlignedLeft(y, STR_FAILSAFE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0);
if (moduleData.failsafeMode == FAILSAFE_CUSTOM) lcdDrawText(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition==1 ? attr : 0);
if (attr) {
if (moduleData.failsafeMode != FAILSAFE_CUSTOM) {
menuHorizontalPosition = 0;
}
if (menuHorizontalPosition == 0) {
if (s_editMode > 0) {
CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST);
if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx);
}
if (menuHorizontalPosition == 0) {
if (s_editMode > 0) {
CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST);
if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx);
}
}
else if (menuHorizontalPosition == 1) {
s_editMode = 0;
if (moduleData.failsafeMode==FAILSAFE_CUSTOM && event==EVT_KEY_FIRST(KEY_ENTER)) {
g_moduleIdx = moduleIdx;
pushMenu(menuModelFailsafe);
}
}
else {
lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - MENUS_SCROLLBAR_WIDTH, 8);
}
else if (menuHorizontalPosition == 1) {
s_editMode = 0;
if (moduleData.failsafeMode==FAILSAFE_CUSTOM && event==EVT_KEY_FIRST(KEY_ENTER)) {
g_moduleIdx = moduleIdx;
pushMenu(menuModelFailsafe);
}
}
else {
lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - MENUS_SCROLLBAR_WIDTH, 8);
}
}
break;
}
break;
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: {
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
#if defined(MULTIMODULE)
@@ -1101,13 +1136,23 @@ void menuModelSetup(event_t event)
}
}
#endif
if (IS_MODULE_R9M(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE) {
lcdDrawTextAlignedLeft(y, STR_SPORT_OUT);
if (IS_MODULE_R9M_FCC(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event);
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEMETRY, attr, event);
}
}
else if (IS_MODULE_R9M_LBT(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_BINDING_OPTION);
}
}
else if (IS_MODULE_SBUS(moduleIdx)) {
@@ -1116,18 +1161,22 @@ void menuModelSetup(event_t event)
}
}
break;
case ITEM_MODEL_EXTERNAL_MODULE_POWER: {
case ITEM_MODEL_EXTERNAL_MODULE_POWER:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
#if defined (MULTIMODULE)
if (IS_MODULE_MULTIMODULE(moduleIdx))
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
#endif
if (IS_MODULE_R9M(moduleIdx)) {
if (IS_MODULE_R9M_FCC(moduleIdx)) {
// Power selection is only available on R9M FCC
lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr);
if (attr)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3);
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX);
}
#if defined (MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
}
#endif
break;
}
@@ -1138,7 +1187,8 @@ void menuModelSetup(event_t event)
else
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
break;
case ITEM_MODEL_EXTERNAL_MODULE_STATUS: {
case ITEM_MODEL_EXTERNAL_MODULE_STATUS:
{
lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS);
char statusText[64];
+2
View File
@@ -83,6 +83,8 @@ void showAlertBox(const char * title, const char * text, const char * action, ui
lcdRefresh();
lcdSetContrast();
clearKeyEvents();
backlightOn();
checkBacklight();
}
void runPopupWarning(event_t event)
+4
View File
@@ -40,6 +40,10 @@ void menuChannelsView(event_t event)
break;
case EVT_KEY_FIRST(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_LEFT):
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LEFT:
case EVT_ROTARY_RIGHT:
#endif
secondPage = !secondPage;
break;
case EVT_KEY_FIRST(KEY_ENTER):
+22 -5
View File
@@ -433,6 +433,8 @@ int getSwitchCount()
void menuMainView(event_t event)
{
static bool secondPage = false;
STICK_SCROLL_DISABLE();
switch(event) {
@@ -491,6 +493,15 @@ void menuMainView(event_t event)
}
#endif
break;
case EVT_KEY_FIRST(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_LEFT):
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LEFT:
case EVT_ROTARY_RIGHT:
#endif
secondPage = !secondPage;
break;
}
// Flight Mode Name
@@ -548,11 +559,17 @@ void menuMainView(event_t event)
}
else {
// Logical Switches
lcdDrawText(TRIM_RH_X - TRIM_LEN/2 + 5, 6*FH-1, "LS 1-32");
for (int sw=0; sw<32; ++sw) {
div_t qr = div(sw, 10);
uint8_t y = 13 + 11 * qr.quot;
uint8_t x = TRIM_RH_X - TRIM_LEN + qr.rem*5 + (qr.rem >= 5 ? 3 : 0);
int sw = (secondPage && MAX_LOGICAL_SWITCHES > 32 ? 32 : 0);
const int end = sw + 32;
uint8_t y = 6*FH-1;
lcdDrawText(TRIM_RH_X - TRIM_LEN/2 + 1, y, "LS");
lcdDrawNumber(lcdLastRightPos + 1, y, sw + 1, LEFT|LEADING0, 2);
lcdDrawText(lcdLastRightPos, y, "-");
lcdDrawNumber(lcdLastRightPos, y, end, LEFT);
for ( ; sw < end; ++sw) {
const div_t qr = div(sw + 32 - end, 10);
const uint8_t x = TRIM_RH_X - TRIM_LEN + qr.rem*5 + (qr.rem >= 5 ? 3 : 0);
y = 13 + 11 * qr.quot;
LogicalSwitchData * cs = lswAddress(sw);
if (cs->func == LS_FUNC_NONE) {
lcdDrawSolidHorizontalLine(x, y+6, 4);
+138 -84
View File
@@ -96,32 +96,54 @@ enum MenuModelSetupItems {
#define MODEL_SETUP_SET_FAILSAFE_OFS 100
#define MODEL_SETUP_SLIDPOT_SPACING 45
#if defined(BINDING_OPTIONS)
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
void onBindMenu(const char * result)
{
if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition);
if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else {
return;
}
moduleFlag[INTERNAL_MODULE] = MODULE_BIND;
moduleFlag[moduleIdx] = MODULE_BIND;
}
#endif
void onModelSetupBitmapMenu(const char * result)
{
@@ -197,8 +219,6 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
}
}
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
int getSwitchWarningsCount()
{
int count = 0;
@@ -219,7 +239,7 @@ int getSwitchWarningsCount()
#define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#if TIMERS == 1
#define TIMERS_ROWS TIMER_ROWS(0)
@@ -263,9 +283,15 @@ bool menuModelSetup(event_t event)
EXTERNAL_MODULE_MODE_ROWS,
MULTIMODULE_STATUS_ROWS
EXTERNAL_MODULE_CHANNELS_ROWS,
((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW,
FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW,
LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS });
((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW,
FAILSAFE_ROWS(EXTERNAL_MODULE),
EXTERNAL_MODULE_OPTION_ROW,
MULTIMODULE_MODULE_ROWS
EXTERNAL_MODULE_POWER_ROW,
LABEL(Trainer),
0,
TRAINER_LINE1_ROWS,
TRAINER_LINE2_ROWS });
if (menuEvent) {
moduleFlag[0] = 0;
@@ -665,6 +691,8 @@ bool menuModelSetup(event_t event)
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
else if (IS_MODULE_DSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0));
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -672,9 +700,9 @@ bool menuModelSetup(event_t event)
lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_CUSTOM, menuHorizontalPosition == 1 ? attr : 0);
lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, multi_rfProto, menuHorizontalPosition==2 ? attr : 0, 2);
lcdDrawNumber(MODEL_SETUP_4TH_COLUMN + MODEL_SETUP_BIND_OFS, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2);
} else {
const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_rfProto);
}
else {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_rfProto);
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0);
if (pdef->subTypeString != nullptr)
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
@@ -696,6 +724,8 @@ bool menuModelSetup(event_t event)
case 1:
if (IS_MODULE_DSM2(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT);
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -708,7 +738,8 @@ bool menuModelSetup(event_t event)
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
} else {
}
else {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
}
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
@@ -876,39 +907,52 @@ bool menuModelSetup(event_t event)
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RECEIVER_NUM);
}
if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) {
if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2);
if (attr && l_posHorz==0 && s_editMode>0) {
if (xOffsetBind)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2);
if (attr && l_posHorz==0 && s_editMode>0)
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx));
}
drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleFlag[moduleIdx] == MODULE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0));
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleFlag[moduleIdx] == MODULE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (multiBindStatus == MULTI_BIND_FINISHED) {
multiBindStatus = MULTI_NORMAL_OPERATION;
s_editMode=0;
s_editMode = 0;
}
#endif
#if defined(BINDING_OPTIONS)
if (attr && l_posHorz>0) {
if(s_editMode>0) {
if (s_editMode>0) {
if (l_posHorz == 1) {
if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) {
if(event==EVT_KEY_BREAK(KEY_ENTER)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1));
if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol == RF_PROTO_X16)) {
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
uint8_t default_selection;
if (IS_MODULE_R9M_LBT(moduleIdx)) {
if (!IS_TELEMETRY_INTERNAL_MODULE())
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF);
default_selection = 2;
}
else {
if (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE))
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
if (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE))
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1);
}
POPUP_MENU_SELECT_ITEM(default_selection);
POPUP_MENU_START(onBindMenu);
continue;
}
if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) {
if (moduleFlag[moduleIdx] == MODULE_BIND) {
newFlag = MODULE_BIND;
}
else {
if (!popupMenuNoItems) {
s_editMode=0; // this is when popup is exited before a choice is made
s_editMode = 0; // this is when popup is exited before a choice is made
}
}
}
@@ -919,13 +963,6 @@ bool menuModelSetup(event_t event)
else if (l_posHorz == 2) {
newFlag = MODULE_RANGECHECK;
}
#else
if (attr && l_posHorz>0 && s_editMode>0) {
if (l_posHorz == 1)
newFlag = MODULE_BIND;
else if (l_posHorz == 2) {
newFlag = MODULE_RANGECHECK;
#endif
}
}
moduleFlag[moduleIdx] = newFlag;
@@ -942,37 +979,37 @@ bool menuModelSetup(event_t event)
case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
if (IS_MODULE_PXX(moduleIdx)) {
ModuleData & moduleData = g_model.moduleData[moduleIdx];
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_FAILSAFE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0);
if (moduleData.failsafeMode == FAILSAFE_CUSTOM) {
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0);
if (moduleData.failsafeMode == FAILSAFE_CUSTOM) {
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition==1 ? attr : 0);
}
if (attr) {
if (moduleData.failsafeMode != FAILSAFE_CUSTOM)
menuHorizontalPosition = 0;
if (menuHorizontalPosition==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST);
if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx);
}
}
if (attr) {
if (moduleData.failsafeMode != FAILSAFE_CUSTOM)
menuHorizontalPosition = 0;
if (menuHorizontalPosition==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST);
if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx);
}
}
else if (menuHorizontalPosition==1) {
s_editMode = 0;
if (moduleData.failsafeMode==FAILSAFE_CUSTOM && event==EVT_KEY_FIRST(KEY_ENTER)) {
g_moduleIdx = moduleIdx;
pushMenu(menuModelFailsafe);
}
}
else {
lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - 2, 8, TEXT_COLOR);
else if (menuHorizontalPosition==1) {
s_editMode = 0;
if (moduleData.failsafeMode==FAILSAFE_CUSTOM && event==EVT_KEY_FIRST(KEY_ENTER)) {
g_moduleIdx = moduleIdx;
pushMenu(menuModelFailsafe);
}
}
else {
lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - 2, 8, TEXT_COLOR);
}
}
break;
}
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: {
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
#if defined(MULTIMODULE)
if (IS_MODULE_MULTIMODULE(moduleIdx)) {
@@ -990,45 +1027,62 @@ bool menuModelSetup(event_t event)
if (attr) {
if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70);
} else if (multi_proto == MM_RF_PROTO_OLRS) {
}
else if (multi_proto == MM_RF_PROTO_OLRS) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7);
} else {
}
else {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
}
}
}
#endif
if (IS_MODULE_R9M(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SPORT_OUT);
if (IS_TELEMETRY_INTERNAL_MODULE) {
if (IS_MODULE_R9M_FCC(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY);
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, attr, event);
}
}
else if (IS_MODULE_R9M_LBT(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
lcdDrawText(MENUS_MARGIN_LEFT,y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_BINDING_OPTION);
}
}
else if (IS_MODULE_SBUS(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_WARN_BATTVOLTAGE);
drawValueWithUnit(MODEL_SETUP_4TH_COLUMN, y, getBatteryVoltage(), UNIT_VOLTS, attr|PREC2|LEFT);
}
}
break;
case ITEM_MODEL_EXTERNAL_MODULE_POWER: {
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
if (IS_MODULE_R9M(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, TR_MULTI_RFPOWER);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), LEFT | attr);
if (attr)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3);
}
case ITEM_MODEL_EXTERNAL_MODULE_POWER:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
if (IS_MODULE_R9M_FCC(moduleIdx)) {
// Power selection is only available on R9M FCC
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFPOWER);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr);
if (attr)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX);
}
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER);
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event);
}
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER);
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event);
}
#endif
}
break;
#if defined(MULTIMODULE)
case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND:
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
+2
View File
@@ -65,6 +65,8 @@ void showAlertBox(const char * title, const char * text, const char * action, ui
lcdRefresh();
lcdSetContrast();
clearKeyEvents();
backlightOn();
checkBacklight();
}
void showMessageBox(const char * title)
+5 -5
View File
@@ -68,7 +68,6 @@ bool isCurrentSensor(int sensor);
bool isTelemetryFieldAvailable(int index);
bool isTelemetryFieldComparisonAvailable(int index);
bool isSensorAvailable(int sensor);
const char* getR9MPowerString(int power);
bool modelHasNotes();
#endif
@@ -128,7 +127,7 @@ void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0);
#define MULTIMODULE_HAS_SUBTYPE(x) (getMultiProtocolDefinition(x)->maxSubtype > 0)
#define MULTIMODULE_HASOPTIONS(x) (getMultiProtocolDefinition(x)->optionsstr != nullptr)
#define MULTI_MAX_RX_NUM(x) (g_model.moduleData[x].getMultiProtocol(true) == MM_RF_PROTO_OLRS ? 4 : 15)
#define MULTIMODULE_HASFAILSAFE(x) (IS_MODULE_MULTIMODULE(x) && getMultiProtocolDefinition(g_model.moduleData[x].getMultiProtocol(true))->failsafe)
#define MULTIMODULE_HASFAILSAFE(x) (IS_MODULE_MULTIMODULE(x) && multiModuleStatus.isValid() && multiModuleStatus.supportsFailsafe())
#define MULTIMODULE_OPTIONS_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) && MULTIMODULE_HASOPTIONS(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))) ? (uint8_t) 0: HIDDEN_ROW
// When using packed, the pointer in here end up not being aligned, which clang and gcc complain about
@@ -158,9 +157,10 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol);
#define IS_R9M_OR_XJTD16(x) ((IS_MODULE_XJT(x) && g_model.moduleData[x].rfProtocol== RF_PROTO_X16) || IS_MODULE_R9M(x))
#define FAILSAFE_ROWS(x) ((IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || IS_MODULE_R9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW
#define R9M_OPTION_ROW (IS_TELEMETRY_INTERNAL_MODULE ? TITLE_ROW : (uint8_t) 0)
#define EXTERNAL_MODULE_OPTION_ROW (IS_MODULE_R9M(EXTERNAL_MODULE) ? R9M_OPTION_ROW : IS_MODULE_SBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW)
#define EXTERNAL_MODULE_POWER_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) || IS_MODULE_R9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW
#define R9M_FCC_OPTION_ROW (IS_TELEMETRY_INTERNAL_MODULE() ? TITLE_ROW : (uint8_t)0)
#define R9M_OPTION_ROW (IS_MODULE_R9M_FCC(EXTERNAL_MODULE) ? R9M_FCC_OPTION_ROW : TITLE_ROW)
#define EXTERNAL_MODULE_OPTION_ROW (IS_MODULE_R9M(EXTERNAL_MODULE) ? R9M_OPTION_ROW : (IS_MODULE_SBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW))
#define EXTERNAL_MODULE_POWER_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) || IS_MODULE_R9M_FCC(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags);
+11 -20
View File
@@ -657,7 +657,7 @@ const pm_char STR_SUBTYPE_SLT[] PROGMEM = "\005""SLT\0 ""Vista";
const pm_char STR_SUBTYPE_CX10[] PROGMEM = "\007""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041""Q242\0 ";
const pm_char STR_SUBTYPE_CG023[] PROGMEM = "\005""CG023""YD829""H8 3d";
const pm_char STR_SUBTYPE_CG023[] PROGMEM = "\005""CG023""YD829";
const pm_char STR_SUBTYPE_KN[] PROGMEM = "\006""WLtoys""FeiLun";
@@ -675,10 +675,14 @@ const pm_char STR_SUBTYPE_WK2x01[] PROGMEM = "\006""WK2801""WK2401""W6_5_1""
const pm_char STR_SUBTYPE_V2X2[] PROGMEM = "\006""V2x2\0 ""JXD506";
const pm_char STR_SUBTYPE_BAYANG[] PROGMEM = "\006""Bayang""H8S3D\0""X16 AH\0";
const pm_char STR_SUBTYPE_BAYANG[] PROGMEM = "\007""Bayang\0""H8S3D\0 ""X16 AH\0 ""irdrone";
const pm_char STR_SUBTYPE_FY326[] PROGMEM = "\005""FY326""FY319";
const pm_char STR_SUBTYPE_CABELL[] PROGMEM = "\006""CAB_V3""C_TELM""-\0 ""-\0 ""-\0 ""-\0 ""F_SAFE""UNBIND";
const pm_char STR_SUBTYPE_H83D[] PROGMEM = "\006""H8_3D\0""H20H\0 ""H20Mini""H30Mini";
const mm_protocol_definition multi_protocols[] = {
{MM_RF_PROTO_FLYSKY, 4, false, STR_SUBTYPE_FLYSKY, nullptr},
@@ -692,18 +696,20 @@ const mm_protocol_definition multi_protocols[] = {
{MM_RF_PROTO_SYMAX, 1, false, STR_SUBTYPE_SYMAX, nullptr},
{MM_RF_PROTO_SLT, 1, false, STR_SUBTYPE_SLT, nullptr},
{MM_RF_PROTO_CX10, 7, false, STR_SUBTYPE_CX10, nullptr},
{MM_RF_PROTO_CG023, 2, false, STR_SUBTYPE_CG023, nullptr},
{MM_RF_PROTO_BAYANG, 2, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY},
{MM_RF_PROTO_CG023, 1, false, STR_SUBTYPE_CG023, nullptr},
{MM_RF_PROTO_BAYANG, 3, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY},
{MM_RF_PROTO_MT99XX, 4, false, STR_SUBTYPE_MT99, nullptr},
{MM_RF_PROTO_MJXQ, 5, false, STR_SUBTYPE_MJXQ, nullptr},
{MM_RF_PROTO_FY326, 1, false, STR_SUBTYPE_FY326, nullptr},
{MM_RF_PROTO_SFHSS, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MM_RF_PROTO_SFHSS, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MM_RF_PROTO_HONTAI, 2, false, STR_SUBTYPE_HONTAI, nullptr},
{MM_RF_PROTO_OLRS, 0, false, NO_SUBTYPE, STR_MULTI_RFPOWER},
{MM_RF_PROTO_FS_AFHDS2A, 3, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ},
{MM_RF_PROTO_Q2X2, 2, false, STR_SUBTYPE_Q2X2, nullptr},
{MM_RF_PROTO_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr},
{MM_RF_PROTO_Q303, 3, false, STR_SUBTYPE_Q303, nullptr},
{MM_RF_PROTO_CABELL, 7, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION},
{MM_RF_PROTO_H83D, 3, false, STR_SUBTYPE_H83D, nullptr},
{MM_RF_CUSTOM_SELECTED, 7, true, NO_SUBTYPE, STR_MULTI_OPTION},
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
@@ -732,18 +738,3 @@ void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, Lcd
else
lcdDrawMMM(x, y, flags);
}
const char* getR9MPowerString(int power)
{
switch (power) {
case 0:
return " 10 mW";
case 1:
return "100 mW";
case 2:
return "500 mW";
case 3:
default:
return " 1 W";
}
}
+10 -1
View File
@@ -503,6 +503,12 @@ enum XJTRFProtocols {
RF_PROTO_LAST = RF_PROTO_LR12
};
enum R9MSubTypes
{
MODULE_SUBTYPE_R9M_FCC,
MODULE_SUBTYPE_R9M_LBT,
};
enum MultiModuleRFProtocols {
MM_RF_PROTO_CUSTOM = -1,
MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM,
@@ -537,7 +543,10 @@ enum MultiModuleRFProtocols {
MM_RF_PROTO_Q303,
MM_RF_PROTO_GW008,
MM_RF_PROTO_DM002,
MM_RF_PROTO_LAST= MM_RF_PROTO_DM002
MM_RF_PROTO_CABELL,
MM_RF_PROTO_ESKY150,
MM_RF_PROTO_H83D,
MM_RF_PROTO_LAST= MM_RF_PROTO_H83D
};
enum MMDSM2Subtypes {
+14 -25
View File
@@ -259,16 +259,22 @@ void generalDefault()
g_eeGeneral.switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE
#endif
#if defined(PCBX9E)
// vBatWarn is voltage in 100mV, vBatMin is in 100mV but with -9V offset, vBatMax has a -12V offset
#if defined(PCBX9E) || defined(PCBX12S)
// NI-MH 9.6V
g_eeGeneral.vBatWarn = 87;
g_eeGeneral.vBatMin = -5;
g_eeGeneral.vBatMax = -5;
g_eeGeneral.vBatMin = -5; //8,5V
g_eeGeneral.vBatMax = -5; //11,5V
#elif defined(PCBX10)
// Lipo 2V
g_eeGeneral.vBatWarn = 66;
g_eeGeneral.vBatMin = -28; // 6.2V
g_eeGeneral.vBatMax = -38; // 8.2V
#elif defined(PCBTARANIS)
// NI-MH 7.2V
// NI-MH 7.2V, X9D, X9D+ and X7
g_eeGeneral.vBatWarn = 65;
g_eeGeneral.vBatMin = -30;
g_eeGeneral.vBatMax = -40;
g_eeGeneral.vBatMin = -30; //6V
g_eeGeneral.vBatMax = -40; //8V
#else
g_eeGeneral.vBatWarn = 90;
#endif
@@ -2809,24 +2815,9 @@ uint32_t pwrCheck()
if (get_tmr10ms() - pwr_press_time > PWR_PRESS_SHUTDOWN_DELAY) {
#if defined(SHUTDOWN_CONFIRMATION)
while (1) {
lcdRefreshWait();
lcdClear();
POPUP_CONFIRMATION("Confirm Shutdown");
event_t evt = getEvent(false);
DISPLAY_WARNING(evt);
lcdRefresh();
if (warningResult == true) {
pwr_check_state = PWR_CHECK_OFF;
return e_power_off;
}
else if (!warningText) {
// shutdown has been cancelled
pwr_check_state = PWR_CHECK_PAUSED;
return e_power_on;
}
}
#else
while ((TELEMETRY_STREAMING() && !g_eeGeneral.disableRssiPoweroffAlarm)) {
#endif
lcdRefreshWait();
lcdClear();
POPUP_CONFIRMATION("Confirm Shutdown");
@@ -2846,7 +2837,6 @@ uint32_t pwrCheck()
haptic.play(15, 3, PLAY_NOW);
pwr_check_state = PWR_CHECK_OFF;
return e_power_off;
#endif
}
else {
drawShutdownAnimation(pwrPressedDuration(), message);
@@ -2884,9 +2874,8 @@ uint32_t pwrCheck()
if (TELEMETRY_STREAMING()) {
RAISE_ALERT(STR_MODEL, STR_MODEL_STILL_POWERED, STR_PRESS_ENTER_TO_CONFIRM, AU_MODEL_STILL_POWERED);
while (TELEMETRY_STREAMING()) {
#if defined(CPUARM)
resetForcePowerOffRequest();
CoTickDelay(10);
#endif
if (pwrPressed()) {
return e_power_on;
}
+3 -1
View File
@@ -454,7 +454,9 @@ void memswap(void * a, void * b, uint8_t size);
#define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8())
#define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount)
#endif
#define IS_MODULE_R9M(idx) (g_model.moduleData[idx].type==MODULE_TYPE_R9M)
#define IS_MODULE_R9M(idx) (g_model.moduleData[idx].type == MODULE_TYPE_R9M)
#define IS_MODULE_R9M_FCC(idx) (IS_MODULE_R9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC)
#define IS_MODULE_R9M_LBT(idx) (IS_MODULE_R9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_LBT)
#define IS_MODULE_PXX(idx) (IS_MODULE_XJT(idx) || IS_MODULE_R9M(idx))
#if defined(DSM2)
+20 -20
View File
@@ -34,7 +34,7 @@
#define MULTI_CHANS 16
#define MULTI_CHAN_BITS 11
void sendFrameProtocolHeader(uint8_t port);
static void sendFrameProtocolHeader(uint8_t port, bool failsafe);
void sendChannels(uint8_t port);
@@ -54,17 +54,6 @@ static void sendSetupFrame()
sendByteSbus(config);
}
static void sendFailFailsafeHeader(uint8_t port)
{
// Old multi firmware will mark config messsages as invalid frame and throw them away
sendByteSbus('M');
sendByteSbus('P');
sendByteSbus(0x81); // Failsafe Data
sendByteSbus(23); // 22 byte channel + 1 byte mode
sendByteSbus(g_model.moduleData->failsafeMode);
}
static void sendFailsafeChannels(uint8_t port)
{
uint32_t bits = 0;
@@ -73,11 +62,18 @@ static void sendFailsafeChannels(uint8_t port)
for (int i = 0; i < MULTI_CHANS; i++) {
int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i];
int pulseValue;
if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD)
failsafeValue = FAILSAFE_CHANNEL_HOLD;
if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES)
failsafeValue = FAILSAFE_CHANNEL_NOPULSE;
if (failsafeValue == FAILSAFE_CHANNEL_HOLD) {
pulseValue = 0;
}
else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) {
pulseValue = 2048;
pulseValue = 2047;
}
else {
failsafeValue += 2 * PPM_CH_CENTER(g_model.moduleData[port].channelsStart + i) - 2 * PPM_CENTER;
@@ -112,12 +108,12 @@ void setupPulsesMultimodule(uint8_t port)
counter++;
if (counter % 1000== 500) {
sendSetupFrame();
} else if (counter % 1000 == 0) {
sendFailFailsafeHeader(port);
} else if (counter % 1000 == 0 && g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) {
sendFrameProtocolHeader(port, true);
sendFailsafeChannels(port);
} else {
// Normal Frame
sendFrameProtocolHeader(port);
sendFrameProtocolHeader(port, false);
sendChannels(port);
}
@@ -151,7 +147,7 @@ void sendChannels(uint8_t port)
}
}
void sendFrameProtocolHeader(uint8_t port)
void sendFrameProtocolHeader(uint8_t port, bool failsafe)
{// byte 1+2, protocol information
// Our enumeration starts at 0
@@ -218,11 +214,15 @@ void sendFrameProtocolHeader(uint8_t port)
type = g_model.moduleData[port].getMultiProtocol(false);
// header, byte 0, 0x55 for proto 0-31 0x54 for 32-63
uint8_t headerByte = 0x54;
if (failsafe)
headerByte = 0x56;
// header, byte 0, 0x55 for proto 0-31 0x54 for 32-63
if (type <= 31)
sendByteSbus(0x55);
sendByteSbus(headerByte+1);
else
sendByteSbus(0x54);
sendByteSbus(headerByte);
// protocol byte
+24
View File
@@ -180,4 +180,28 @@ inline void SEND_FAILSAFE_1S()
}
}
#define LEN_R9M_MODES "\007"
#define TR_R9M_MODES "FCC\0 ""LBT(EU)"
#define LEN_R9M_FCC_POWER_VALUES "\006"
#define LEN_R9M_LBT_POWER_VALUES "\006"
#define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0"
#define TR_R9M_LBT_POWER_VALUES "25 mW\0" "500 mW"
enum R9MFCCPowerValues {
R9M_FCC_POWER_10 = 0,
R9M_FCC_POWER_100,
R9M_FCC_POWER_500,
R9M_FCC_POWER_1000,
R9M_FCC_POWER_MAX = R9M_FCC_POWER_1000
};
enum R9MLBTPowerValues {
R9M_LBT_POWER_25 = 0,
R9M_LBT_POWER_500,
R9M_LBT_POWER_MAX = R9M_LBT_POWER_500
};
#define BIND_TELEM_ALLOWED(idx) (!IS_MODULE_R9M_LBT(idx) || g_model.moduleData[idx].pxx.power == R9M_LBT_POWER_25)
#define BIND_CH9TO16_ALLOWED(idx) (!IS_MODULE_R9M_LBT(idx) || g_model.moduleData[idx].pxx.power != R9M_LBT_POWER_25)
#endif // _PULSES_ARM_H_
+8 -9
View File
@@ -378,18 +378,17 @@ void setupPulsesPXX(uint8_t port)
/* Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) */
#if defined(PCBHORUS)
if (port == INTERNAL_MODULE) {
extra_flags |= g_model.moduleData[port].pxx.external_antenna;
extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0);
}
#endif
#if defined(BINDING_OPTIONS)
extra_flags |= g_model.moduleData[port].pxx.receiver_telem_off << 1;
extra_flags |= g_model.moduleData[port].pxx.receiver_channel_9_16 << 2;
#endif
extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1);
extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2);
if (IS_MODULE_R9M(port)) {
extra_flags |= g_model.moduleData[port].pxx.power << 3;
// Disable s.port if internal module is active
if (IS_TELEMETRY_INTERNAL_MODULE || !g_model.moduleData[port].pxx.sport_out)
extra_flags |= (1<< 5);
extra_flags |= (min(g_model.moduleData[port].pxx.power, IS_MODULE_R9M_FCC(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3);
// Disable S.PORT if internal module is active
if (IS_TELEMETRY_INTERNAL_MODULE() || !g_model.moduleData[port].pxx.sport_out) {
extra_flags |= (1 << 5);
}
}
putPcmByte(port, extra_flags);
+6 -3
View File
@@ -115,16 +115,19 @@ inline const pm_char * SDCARD_ERROR(FRESULT result)
const char * getFileExtension(const char * filename, uint8_t size=0, uint8_t extMaxLen=0, uint8_t *fnlen=NULL, uint8_t *extlen=NULL);
// TODO REMOVE THE O9X FOURCC in 2.3
#if defined(PCBHORUS)
#define OTX_FOURCC 0x3478746F // otx for Horus
#if defined(PCBX12S)
#define OTX_FOURCC 0x3478746F // otx for X12S
#define O9X_FOURCC 0x3178396F // we forgot it in 2.2 RC ..
#elif defined(PCBX10)
#define OTX_FOURCC 0x3778746F // otx for X10
#define O9X_FOURCC 0x3478746F // match X12S, we forgot OTX_FOURCC before 2.2.1 RC2
#elif defined(PCBX9E)
#define OTX_FOURCC 0x3578746F // otx for Taranis X9E
#define O9X_FOURCC 0x3378396F // o9x for Taranis X9E
#elif defined(PCBX7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7
#define O9X_FOURCC 0x3378396F // o9x for Taranis X7
#elif defined(PCBTARANIS)
#elif defined(PCBX9D) || defined(PCBX9DP)
#define OTX_FOURCC 0x3378746F // otx for Taranis X9D
#define O9X_FOURCC 0x3378396F // o9x for Taranis X9D
#elif defined(PCBSKY9X)
+13 -1
View File
@@ -279,15 +279,27 @@ void simuSetSwitch(uint8_t swtch, int8_t state)
// SWITCH_3_CASE(5, SWITCHES_GPIO_REG_F_H, SWITCHES_GPIO_REG_F_L, SWITCHES_GPIO_PIN_F_H, SWITCHES_GPIO_PIN_F_L)
#elif defined(PCBTARANIS) || defined(PCBHORUS)
SWITCH_3_CASE(0, SWITCHES_GPIO_REG_A_L, SWITCHES_GPIO_REG_A_H, SWITCHES_GPIO_PIN_A_L, SWITCHES_GPIO_PIN_A_H)
#if !defined(PCBX10)
SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H)
#else
SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_PIN_B_H, SWITCHES_GPIO_PIN_B_L)
#endif
SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H)
#if !defined(PCBX10)
SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H)
#else
SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_PIN_D_H, SWITCHES_GPIO_PIN_D_L)
#endif
#if defined(PCBX7)
SWITCH_CASE(4, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F)
SWITCH_CASE(5, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H)
#else
#if !defined(PCBX10)
SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H)
#if defined(PCBHORUS)
#else
SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_PIN_E_H, SWITCHES_GPIO_PIN_E_L)
#endif
#if defined(PCBX12S)
SWITCH_CASE_NEGATIVE(5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F)
#else
SWITCH_CASE(5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F)
+2 -2
View File
@@ -657,7 +657,7 @@
#define LCD_RST_GPIO GPIOD
#define LCD_RST_GPIO_PIN GPIO_Pin_15 // PD.15
#define LCD_DMA DMA1
#define LDC_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream_IRQn DMA1_Stream7_IRQn
#define LCD_DMA_Stream_IRQHandler DMA1_Stream7_IRQHandler
#define LCD_DMA_FLAGS (DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7 | DMA_HIFCR_CFEIF7)
@@ -678,7 +678,7 @@
#define LCD_RST_GPIO GPIOD
#define LCD_RST_GPIO_PIN GPIO_Pin_12 // PD.12
#define LCD_DMA DMA1
#define LDC_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream_IRQn DMA1_Stream7_IRQn
#define LCD_DMA_Stream_IRQHandler DMA1_Stream7_IRQHandler
#define LCD_DMA_FLAGS (DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7 | DMA_HIFCR_CFEIF7)
+15 -15
View File
@@ -85,17 +85,17 @@ void lcdHardwareInit()
GPIO_PinAFConfig(LCD_SPI_GPIO, LCD_MOSI_GPIO_PinSource, LCD_GPIO_AF);
GPIO_PinAFConfig(LCD_SPI_GPIO, LCD_CLK_GPIO_PinSource, LCD_GPIO_AF);
LDC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA->HIFCR = LCD_DMA_FLAGS; // Write ones to clear bits
LDC_DMA_Stream->CR = DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0;
LDC_DMA_Stream->PAR = (uint32_t)&LCD_SPI->DR;
LCD_DMA_Stream->CR = DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0;
LCD_DMA_Stream->PAR = (uint32_t)&LCD_SPI->DR;
#if defined(PCBX7)
LDC_DMA_Stream->NDTR = LCD_W;
LCD_DMA_Stream->NDTR = LCD_W;
#else
LDC_DMA_Stream->M0AR = (uint32_t)displayBuf;
LDC_DMA_Stream->NDTR = LCD_W*LCD_H/8*4;
LCD_DMA_Stream->M0AR = (uint32_t)displayBuf;
LCD_DMA_Stream->NDTR = LCD_W*LCD_H/8*4;
#endif
LDC_DMA_Stream->FCR = 0x05; // DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
LCD_DMA_Stream->FCR = 0x05; // DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
NVIC_EnableIRQ(LCD_DMA_Stream_IRQn);
}
@@ -187,10 +187,10 @@ void lcdRefresh(bool wait)
LCD_A0_HIGH();
lcd_busy = true;
LDC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA->HIFCR = LCD_DMA_FLAGS; // Write ones to clear bits
LDC_DMA_Stream->M0AR = (uint32_t)p;
LDC_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts
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();
@@ -208,16 +208,16 @@ void lcdRefresh(bool wait)
LCD_NCS_LOW();
LCD_A0_HIGH();
LDC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA->HIFCR = LCD_DMA_FLAGS; // Write ones to clear bits
#if defined(LCD_DUAL_BUFFER)
// Switch LCD buffer
LDC_DMA_Stream->M0AR = (uint32_t)displayBuf;
LCD_DMA_Stream->M0AR = (uint32_t)displayBuf;
displayBuf = (displayBuf == displayBuf1) ? displayBuf2 : displayBuf1;
#endif
LDC_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts
LCD_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts
LCD_SPI->CR2 |= SPI_CR2_TXDMAEN;
#endif
}
@@ -226,10 +226,10 @@ extern "C" void LCD_DMA_Stream_IRQHandler()
{
DEBUG_INTERRUPT(INT_LCD);
LDC_DMA_Stream->CR &= ~DMA_SxCR_TCIE; // Stop interrupt
LCD_DMA_Stream->CR &= ~DMA_SxCR_TCIE; // Stop interrupt
LCD_DMA->HIFCR |= LCD_DMA_FLAG_INT; // Clear interrupt flag
LCD_SPI->CR2 &= ~SPI_CR2_TXDMAEN;
LDC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
LCD_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
while (LCD_SPI->SR & SPI_SR_BSY) {
/* Wait for SPI to finish sending data
-5
View File
@@ -88,11 +88,6 @@ uint16_t stackAvailable()
volatile uint16_t timeForcePowerOffPressed = 0;
void resetForcePowerOffRequest()
{
timeForcePowerOffPressed = 0;
}
bool isForcePowerOffRequested()
{
if (pwrOffPressed()) {
+3
View File
@@ -73,4 +73,7 @@ extern TaskStack<AUDIO_STACK_SIZE> audioStack;
void tasksStart();
extern volatile uint16_t timeForcePowerOffPressed;
inline void resetForcePowerOffRequest() {timeForcePowerOffPressed = 0; }
#endif // _TASKS_ARM_H_
+7 -1
View File
@@ -82,6 +82,7 @@ static void processMultiSyncPacket(const uint8_t *data)
multiSyncStatus.target = data[5];
#if !defined(PPM_PIN_SERIAL)
auto oldlag = multiSyncStatus.inputLag;
(void) oldlag;
#endif
multiSyncStatus.calcAdjustedRefreshRate(data[0] << 8 | data[1], data[2] << 8 | data[3]);
@@ -272,7 +273,7 @@ void MultiModuleSyncStatus::getRefreshString(char *statusText)
void MultiModuleStatus::getStatusString(char *statusText)
{
if (get_tmr10ms() - lastUpdate > 200) {
if (!isValid()) {
#if defined(PCBTARANIS) || defined(PCBHORUS)
if (IS_INTERNAL_MODULE_ENABLED())
strcpy(statusText, STR_DISABLE_INTERNAL);
@@ -293,6 +294,11 @@ void MultiModuleStatus::getStatusString(char *statusText)
strcpy(statusText, STR_MODULE_NO_INPUT);
return;
}
else if(isWaitingforBind()) {
strcpy(statusText, STR_MODULE_WAITFORBIND);
return;
}
strcpy(statusText, "V");
appendInt(statusText, major);
+3
View File
@@ -122,6 +122,9 @@ struct MultiModuleStatus {
void getStatusString(char* statusText);
inline bool isValid() { return (bool)(get_tmr10ms() - lastUpdate < 200); }
inline bool supportsFailsafe() { return (bool) (flags & 0x20); }
inline bool isWaitingforBind() { return (bool) (flags & 0x10); }
inline bool isBinding() { return (bool) (flags & 0x08); }
inline bool protocolValid() { return (bool) (flags & 0x04); }
inline bool serialMode() { return (bool) (flags & 0x02); }
+2 -2
View File
@@ -198,9 +198,9 @@ extern Fifo<uint8_t, LUA_TELEMETRY_INPUT_FIFO_SIZE> * luaInputTelemetryFifo;
#endif
#if defined(STM32)
#define IS_TELEMETRY_INTERNAL_MODULE (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT)
#define IS_TELEMETRY_INTERNAL_MODULE() (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT)
#else
#define IS_TELEMETRY_INTERNAL_MODULE (false)
#define IS_TELEMETRY_INTERNAL_MODULE() (false)
#endif
#endif // _TELEMETRY_H_
+15 -6
View File
@@ -108,6 +108,9 @@ const pm_char STR_OPEN9X[] PROGMEM =
#if defined(CPUARM)
ISTR(VTRAINERMODES)
ISTR(TARANIS_PROTOCOLS)
ISTR(R9M_MODES)
ISTR(R9M_FCC_POWER_VALUES)
ISTR(R9M_LBT_POWER_VALUES)
ISTR(TELEMETRY_PROTOCOLS)
ISTR(XJT_PROTOCOLS)
ISTR(DSM_PROTOCOLS)
@@ -388,7 +391,7 @@ const pm_char STR_RECEIVER[] PROGMEM = TR_RECEIVER;
const pm_char STR_SYNCMENU[] PROGMEM = TR_SYNCMENU;
const pm_char STR_INTERNALRF[] PROGMEM = TR_INTERNALRF;
const pm_char STR_EXTERNALRF[] PROGMEM = TR_EXTERNALRF;
const pm_char STR_SPORT_OUT[] PROGMEM = TR_SPORT_OUT;
const pm_char STR_MODULE_TELEMETRY[] PROGMEM = TR_MODULE_TELEMETRY;
const pm_char STR_COUNTRYCODE[] PROGMEM = TR_COUNTRYCODE;
const pm_char STR_USBMODE[] PROGMEM = TR_USBMODE;
const pm_char STR_FAILSAFE[] PROGMEM = TR_FAILSAFE;
@@ -475,13 +478,13 @@ const pm_char STR_MULTI_CUSTOM[] PROGMEM = TR_MULTI_CUSTOM;
const pm_char STR_MULTI_RFTUNE[] PROGMEM = TR_MULTI_RFTUNE;
const pm_char STR_MULTI_TELEMETRY[] PROGMEM = TR_MULTI_TELEMETRY;
const pm_char STR_MULTI_VIDFREQ[] PROGMEM = TR_MULTI_VIDFREQ;
const pm_char STR_MULTI_RFPOWER[] PROGMEM = TR_MULTI_RFPOWER;
const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION;
const pm_char STR_MULTI_AUTOBIND[] PROGMEM = TR_MULTI_AUTOBIND;
const pm_char STR_MULTI_DSM_AUTODTECT[] PROGMEM = TR_MULTI_DSM_AUTODTECT;
const pm_char STR_MULTI_LOWPOWER[] PROGMEM = TR_MULTI_LOWPOWER;
const pm_char STR_MODULE_NO_SERIAL_MODE[] PROGMEM = TR_MODULE_NO_SERIAL_MODE;
const pm_char STR_MODULE_NO_INPUT[] PROGMEM = TR_MODULE_NO_INPUT;
const pm_char STR_MODULE_WAITFORBIND[] PROGMEM = TR_MODULE_WAITFORBIND;
const pm_char STR_MODULE_NO_TELEMETRY[] PROGMEM = TR_MODULE_NO_TELEMETRY;
const pm_char STR_MODULE_BINDING[] PROGMEM = TR_MODULE_BINDING;
const pm_char STR_PROTOCOL_INVALID[] PROGMEM = TR_PROTOCOL_INVALID;
@@ -614,10 +617,15 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR;
#if defined(CPUARM)
const pm_char STR_TRAINER[] PROGMEM = TR_TRAINER;
const pm_char STR_MODULE_BIND[] PROGMEM = TR_MODULE_BIND;
const pm_char STR_BINDING_1_8_TELEM_ON[] PROGMEM = TR_BINDING_MODE1;
const pm_char STR_BINDING_1_8_TELEM_OFF[] PROGMEM = TR_BINDING_MODE2;
const pm_char STR_BINDING_9_16_TELEM_ON[] PROGMEM = TR_BINDING_MODE3;
const pm_char STR_BINDING_9_16_TELEM_OFF[] PROGMEM = TR_BINDING_MODE4;
const pm_char STR_BINDING_1_8_TELEM_ON[] PROGMEM = TR_BINDING_CH1_8_TELEM_ON;
const pm_char STR_BINDING_1_8_TELEM_OFF[] PROGMEM = TR_BINDING_CH1_8_TELEM_OFF;
const pm_char STR_BINDING_9_16_TELEM_ON[] PROGMEM = TR_BINDING_CH9_16_TELEM_ON;
const pm_char STR_BINDING_9_16_TELEM_OFF[] PROGMEM = TR_BINDING_CH9_16_TELEM_OFF;
const pm_char STR_BINDING_25MW_CH1_8_TELEM_OFF[] PROGMEM = TR_BINDING_25MW_CH1_8_TELEM_OFF;
const pm_char STR_BINDING_25MW_CH1_8_TELEM_ON[] PROGMEM = TR_BINDING_25MW_CH1_8_TELEM_ON;
const pm_char STR_BINDING_500MW_CH1_8_TELEM_OFF[] PROGMEM = TR_BINDING_500MW_CH1_8_TELEM_OFF;
const pm_char STR_BINDING_500MW_CH9_16_TELEM_OFF[] PROGMEM = TR_BINDING_500MW_CH9_16_TELEM_OFF;
const pm_char STR_BINDING_OPTION[] PROGMEM = TR_BINDING_OPTION;
const pm_char STR_CHANNELRANGE[] PROGMEM = TR_CHANNELRANGE;
const pm_char STR_ANTENNASELECTION[] PROGMEM = TR_ANTENNASELECTION;
const pm_char STR_ANTENNACONFIRM1[] PROGMEM = TR_ANTENNACONFIRM1;
@@ -675,6 +683,7 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR;
const pm_char STR_ADDMAINVIEW[] PROGMEM = TR_ADDMAINVIEW;
const pm_char STR_BACKGROUND_COLOR[] PROGMEM = TR_BACKGROUND_COLOR;
const pm_char STR_MAIN_COLOR[] PROGMEM = TR_MAIN_COLOR;
const pm_char STR_MULTI_RFPOWER[] PROGMEM = TR_MULTI_RFPOWER;
#endif
#if defined(CPUARM)
+27 -13
View File
@@ -87,11 +87,11 @@
#if defined(PCBHORUS)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH
#elif defined(PCBX9E)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH
#elif defined(PCBTARANIS) && defined(BLUETOOTH)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH
#elif defined(PCBTARANIS)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY
#elif defined(CPUARM)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY
#endif
@@ -219,10 +219,13 @@ extern const pm_char STR_OPEN9X[];
#define OFS_VTRAINERMODES (OFS_VFAILSAFE)
#endif
#if defined(CPUARM)
#define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES))
#define OFS_TELEMETRY_PROTOCOLS (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS))
#define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS))
#define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS))
#define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES))
#define OFS_R9M_MODES (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS))
#define OFS_R9M_FCC_POWER_VALUES (OFS_R9M_MODES + sizeof(TR_R9M_MODES))
#define OFS_R9M_LBT_POWER_VALUES (OFS_R9M_FCC_POWER_VALUES + sizeof(TR_R9M_FCC_POWER_VALUES))
#define OFS_TELEMETRY_PROTOCOLS (OFS_R9M_LBT_POWER_VALUES + sizeof(TR_R9M_LBT_POWER_VALUES))
#define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS))
#define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS))
#if defined(MULTIMODULE)
#define OFS_MULTI_PROTOCOLS (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS))
#define OFS_VOLTSRC (OFS_MULTI_PROTOCOLS + sizeof(TR_MULTI_PROTOCOLS))
@@ -348,7 +351,10 @@ extern const pm_char STR_OPEN9X[];
#if defined(CPUARM)
#define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES)
#define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS)
#define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS)
#define STR_R9M_MODES (STR_OPEN9X + OFS_R9M_MODES)
#define STR_R9M_FCC_POWER_VALUES (STR_OPEN9X + OFS_R9M_FCC_POWER_VALUES)
#define STR_R9M_LBT_POWER_VALUES (STR_OPEN9X + OFS_R9M_LBT_POWER_VALUES)
#define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS)
#define STR_XJT_PROTOCOLS (STR_OPEN9X + OFS_XJT_PROTOCOLS)
#define STR_DSM_PROTOCOLS (STR_OPEN9X + OFS_DSM_PROTOCOLS)
#if defined(MULTIMODULE)
@@ -604,7 +610,6 @@ extern const pm_char STR_FAS_OFFSET[];
extern const pm_char STR_MULTI_CUSTOM[];
extern const pm_char STR_MULTI_OPTION[];
extern const pm_char STR_MULTI_VIDFREQ[];
extern const pm_char STR_MULTI_RFPOWER[];
extern const pm_char STR_MULTI_RFTUNE[];
extern const pm_char STR_MULTI_TELEMETRY[];
extern const pm_char STR_MULTI_AUTOBIND[];
@@ -612,6 +617,7 @@ extern const pm_char STR_MULTI_DSM_AUTODTECT[];
extern const pm_char STR_MULTI_LOWPOWER[];
extern const pm_char STR_MODULE_NO_SERIAL_MODE[];
extern const pm_char STR_MODULE_NO_INPUT[];
extern const pm_char STR_MODULE_WAITFORBIND[];
extern const pm_char STR_MODULE_NO_TELEMETRY[];
extern const pm_char STR_MODULE_BINDING[];
extern const pm_char STR_PROTOCOL_INVALID[];
@@ -631,7 +637,7 @@ extern const pm_char STR_RECEIVER[];
extern const pm_char STR_SYNCMENU[];
extern const pm_char STR_INTERNALRF[];
extern const pm_char STR_EXTERNALRF[];
extern const pm_char STR_SPORT_OUT[];
extern const pm_char STR_MODULE_TELEMETRY[];
extern const pm_char STR_FAILSAFE[];
extern const pm_char STR_FAILSAFESET[];
extern const pm_char STR_HOLD[];
@@ -843,6 +849,7 @@ extern const pm_char STR_BLCOLOR[];
extern const LanguagePack skLanguagePack;
extern const LanguagePack seLanguagePack;
extern const LanguagePack huLanguagePack;
extern const LanguagePack ruLanguagePack;
extern const LanguagePack * const languagePacks[];
#if defined(LANGUAGE_PACKS_DEFINITION)
const LanguagePack * const languagePacks[] = {
@@ -856,6 +863,7 @@ extern const pm_char STR_BLCOLOR[];
&itLanguagePack,
&plLanguagePack,
&ptLanguagePack,
&ruLanguagePack,
&seLanguagePack,
&skLanguagePack,
NULL
@@ -917,6 +925,11 @@ extern const pm_char STR_BLCOLOR[];
extern const pm_char STR_BINDING_1_8_TELEM_OFF[];
extern const pm_char STR_BINDING_9_16_TELEM_ON[];
extern const pm_char STR_BINDING_9_16_TELEM_OFF[];
extern const pm_char STR_BINDING_25MW_CH1_8_TELEM_OFF[];
extern const pm_char STR_BINDING_25MW_CH1_8_TELEM_ON[];
extern const pm_char STR_BINDING_500MW_CH1_8_TELEM_OFF[];
extern const pm_char STR_BINDING_500MW_CH9_16_TELEM_OFF[];
extern const pm_char STR_BINDING_OPTION[];
extern const pm_char STR_CHANNELRANGE[];
extern const pm_char STR_ANTENNASELECTION[];
extern const pm_char STR_ANTENNACONFIRM1[];
@@ -929,9 +942,9 @@ extern const pm_char STR_BLCOLOR[];
extern const pm_char STR_RESET_SUBMENU[];
extern const pm_char STR_LOWALARM[];
extern const pm_char STR_CRITICALALARM[];
extern const pm_char STR_RSSIALARM_WARN[];
extern const pm_char STR_NO_RSSIALARM[];
extern const pm_char STR_DISABLE_ALARM[];
extern const pm_char STR_RSSIALARM_WARN[];
extern const pm_char STR_NO_RSSIALARM[];
extern const pm_char STR_DISABLE_ALARM[];
extern const pm_char STR_TELEMETRY_TYPE[];
extern const pm_char STR_TELEMETRY_SENSORS[];
extern const pm_char STR_VALUE[];
@@ -974,6 +987,7 @@ extern const pm_char STR_DISABLE_ALARM[];
extern const pm_char STR_ADDMAINVIEW[];
extern const pm_char STR_BACKGROUND_COLOR[];
extern const pm_char STR_MAIN_COLOR[];
extern const pm_char STR_MULTI_RFPOWER[];
#endif
#if defined(CPUARM)
+12 -6
View File
@@ -108,7 +108,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -860,16 +860,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telemetry", "No MULTI_TELEMETRY", "No MULTI_TELEMETRY detected")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING TR("Bind...","Binding")
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -115,7 +115,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -881,16 +881,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetrie"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetrie")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -114,7 +114,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -864,16 +864,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3("No telemetry", "No MULTI_TELEMETRY", "No MULTI_TELEMETRY detected")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING TR("Bind...","Binding")
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+13 -7
View File
@@ -110,7 +110,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -840,16 +840,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -110,7 +110,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -836,16 +836,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+41 -27
View File
@@ -110,7 +110,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Perso"
@@ -321,7 +321,7 @@
#define LEN_VFSWRESET TR("\004", "\012")
#if defined(TELEMETRY_FRSKY)
#define TR_FSW_RESET_TELEM TR("Télm", "Télémesure")
#define TR_FSW_RESET_TELEM TR("Télm", "Télémétrie")
#else
#define TR_FSW_RESET_TELEM
#endif
@@ -455,8 +455,16 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#if defined(PCBHORUS)
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Entree""Haut\0 ""Bas\0 ""Droit\0""Gauche"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menu\0""Exit\0""Bas\0 ""Haut\0""Droit""Gauch", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins"
#else
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Bas\0 ""Haut\0""Droit""Gauch"
#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@@ -623,7 +631,7 @@
#endif
#if defined(PCBTARANIS)
#define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER
#define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER)
#else
#define TR_POPUPS TR_ENTER "\010" TR_EXIT
#define OFS_EXIT sizeof(TR_ENTER)
@@ -813,8 +821,8 @@
#define TR_MENUTRAINER "ECOLAGE"
#define TR_MENUSPECIALFUNCS "FONCTIONS GLOBALES"
#define TR_MENUVERSION "VERSION"
#define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS")
#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTREES ANALOGIQUES")
#define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS")
#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTREES ANALOGIQUES")
#define TR_MENUCALIBRATION "CALIBRATION"
#define TR_TRIMS2OFFSETS "\005Trims => Subtrims"
#define TR_MENUMODELSEL "MODELES"
@@ -863,16 +871,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Bind auto", INDENT "Bind automatique")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodét.", INDENT "Autodétection")
#define TR_MULTI_LOWPOWER TR(INDENT "Basse puis.", INDENT "Mode basse puiss.")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Télem. mod.", INDENT "Télémétrie module")
#define TR_DISABLE_INTERNAL TR("Désact intRF", "Désact. RF interne")
#define TR_MODULE_NO_SERIAL_MODE TR("Mode série?", "Pas en mode série")
#define TR_MODULE_NO_INPUT TR("Pas de sign.", "Aucun signal série")
#define TR_MODULE_NO_TELEMETRY TR3("Pas de télm.", "Télémétrie absente", "Télémétrie absente(act. MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Binder d'abord"
#define TR_MODULE_BINDING "Bind..."
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Télem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Télem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Télem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Télem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Télem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Télem ON"
#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Télem OFF"
#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Télem OFF"
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Sél. invalide", "Protocole invalide")
#define TR_MODULE_STATUS TR(INDENT "Etat", INDENT "Etat module")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
@@ -920,7 +934,7 @@
#define TR_SWITCHWARN TR("INTERS","CONTROLES")
#define TR_FAILSAFEWARN "FAILSAFE"
#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD")
#define TR_NIGHTLY_NOTSAFE "Version not safe to fly"
#define TR_NIGHTLY_NOTSAFE "Version de test uniq."
#define TR_WRONG_SDCARDVERSION "Version requise: "
#define TR_WRONG_PCBREV "PCB incorrect détecté"
#define TR_EMERGENCY_MODE "MODE SECOURS"
@@ -1020,7 +1034,7 @@
#define TR_RESET_TIMER1 TR("Réinit. Timer1", "Réinitialiser Timer1")
#define TR_RESET_TIMER2 TR("Réinit. Timer2", "Réinitialiser Timer2")
#define TR_RESET_TIMER3 TR("Réinit. Timer3", "Réinitialiser Timer3")
#define TR_RESET_TELEMETRY TR("Réinit. Télém.", "Réinit. Télémesure")
#define TR_RESET_TELEMETRY TR("Réinit. Télém.", "Réinit. Télémétrie")
#define TR_STATISTICS "Statistiques"
#define TR_ABOUT_US "A propos"
#define TR_USB_JOYSTICK "USB Joystick (HID)"
@@ -1042,7 +1056,7 @@
#define TR_ANTENNAPROBLEM CENTER "Antenne radio défectueuse!"
#define TR_MODELIDUSED TR("ID affecté à :", "No de récepteur utilisé par :")
#define TR_MODULE INDENT "Type de module"
#define TR_TELEMETRY_TYPE TR("Type tél.", "Type télémesure")
#define TR_TELEMETRY_TYPE TR("Type tél.", "Type télémétrie")
#define TR_TELEMETRY_SENSORS "Capteurs"
#define TR_VALUE "Valeur"
#define TR_TOPLCDTIMER "Timer LCD haut"
@@ -1055,8 +1069,8 @@
#define TR_LOWALARM INDENT "Alarme basse"
#define TR_CRITICALALARM INDENT "Alarme critique"
#define TR_RSSIALARM_WARN TR("RSSI", "TELEMETRIE")
#define TR_NO_RSSIALARM TR(INDENT "Alarms disabled", "Alarme télémétrie désactivée")
#define TR_DISABLE_ALARM TR(INDENT "Disable alarms", INDENT "Désactiver alarme télémétrie")
#define TR_NO_RSSIALARM TR(INDENT "Alarmes désact.", "Alarme télémétrie désactivée")
#define TR_DISABLE_ALARM TR(INDENT "Désact. alarme", INDENT "Désactiver alarme télémétrie")
#define TR_ENABLE_POPUP "Activer popup"
#define TR_DISABLE_POPUP "Désactiver popup"
#define TR_POPUP "Popup"
@@ -1145,16 +1159,16 @@
#define TR_LSW_HEADERS_DURATION "Durée min."
#define TR_LSW_HEADERS_DELAY "Délai"
#define TR_GVAR_HEADERS_NAME "Name"
#define TR_GVAR_HEADERS_FM0 "Value on FM0"
#define TR_GVAR_HEADERS_FM1 "Value on FM1"
#define TR_GVAR_HEADERS_FM2 "Value on FM2"
#define TR_GVAR_HEADERS_FM3 "Value on FM3"
#define TR_GVAR_HEADERS_FM4 "Value on FM4"
#define TR_GVAR_HEADERS_FM5 "Value on FM5"
#define TR_GVAR_HEADERS_FM6 "Value on FM6"
#define TR_GVAR_HEADERS_FM7 "Value on FM7"
#define TR_GVAR_HEADERS_FM8 "Value on FM8"
#define TR_GVAR_HEADERS_NAME "Nom"
#define TR_GVAR_HEADERS_FM0 "Valeur FM0"
#define TR_GVAR_HEADERS_FM1 "Valeur FM1"
#define TR_GVAR_HEADERS_FM2 "Valeur FM2"
#define TR_GVAR_HEADERS_FM3 "Valeur FM3"
#define TR_GVAR_HEADERS_FM4 "Valeur FM4"
#define TR_GVAR_HEADERS_FM5 "Valeur FM5"
#define TR_GVAR_HEADERS_FM6 "Valeur FM6"
#define TR_GVAR_HEADERS_FM7 "Valeur FM7"
#define TR_GVAR_HEADERS_FM8 "Valeur FM8"
// Horus footer descriptions
#define TR_LSW_DESCRIPTIONS { "Type de comparaison ou fonction", "Première variable", "Seconde variable ou constante", "Seconde variable ou constante", "Condition supplémentaire pour activer la ligne", "Durée minimale d'activation de l'inter logique", "Durée min de la condition avant l'activation de l'inter" }
@@ -1279,7 +1293,7 @@
#define TR_MENU_TRAINER "\317Ecolage"
#define TR_MENU_CHANNELS "\320Canaux"
#define TR_MENU_GVARS "\311Vars. glob."
#define TR_MENU_TELEMETRY "\321Télémesure"
#define TR_MENU_TELEMETRY "\321Télémétrie"
#define TR_MENU_DISPLAY "AFFICHAGE"
#define TR_MENU_OTHER "Autres"
#define TR_MENU_INVERT "Inverser"
+12 -6
View File
@@ -110,7 +110,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -865,16 +865,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -115,7 +115,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -863,16 +863,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -111,7 +111,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -867,16 +867,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -110,7 +110,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -842,16 +842,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+12 -6
View File
@@ -110,7 +110,7 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\006"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0"
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esky15""H8 3D\0"
#define TR_MULTI_CUSTOM "Custom"
@@ -879,16 +879,22 @@
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_SPORT_OUT INDENT "Telemetry"
#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
#define TR_MODULE_WAITFORBIND "Bind to load protocol"
#define TR_MODULE_BINDING "Binding"
#define TR_BINDING_MODE1 "Ch1-8 Telem ON"
#define TR_BINDING_MODE2 "Ch1-8 Telem OFF"
#define TR_BINDING_MODE3 "Ch9-16 Telem ON"
#define TR_BINDING_MODE4 "Ch9-16 Telem OFF"
#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
#define TR_BINDING_25MW_CH1_8_TELEM_OFF TR("25mW Ch1-8 Tel OFF", "25mW Ch1-8 Telem OFF")
#define TR_BINDING_25MW_CH1_8_TELEM_ON TR("25mW Ch1-8 Tel ON", "25mW Ch1-8 Telem ON")
#define TR_BINDING_500MW_CH1_8_TELEM_OFF TR("500mW Ch1-8 Tel OFF", "500mW Ch1-8 Telem OFF")
#define TR_BINDING_500MW_CH9_16_TELEM_OFF TR("500mW Ch9-16 Tel OFF", "500mW Ch9-16 Telem OFF")
#define TR_BINDING_OPTION "Set at bind"
#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync")
+222
View File
@@ -0,0 +1,222 @@
/*
* Author
* - Alexander Novikov (mr.pokryshkin@gmail.com)
*
* tts_ru is based on tts_de and tts_en
*
* opentx is based on code named
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
* er9x by Erez Raviv: http://code.google.com/p/er9x/,
* and the original (and ongoing) project by
* Thomas Husterer, th9x: http://code.google.com/p/th9x/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "opentx.h"
enum RusPrompts {
RU_PROMPT_NUMBERS_BASE = 0,
RU_PROMPT_ZERO = RU_PROMPT_NUMBERS_BASE+0, //02-99
RU_PROMPT_HUNDRED = RU_PROMPT_NUMBERS_BASE+100, //100,200 .. 900
RU_PROMPT_AND = RU_PROMPT_NUMBERS_BASE+110, // и
RU_PROMPT_MINUS = RU_PROMPT_NUMBERS_BASE+111, // минус
RU_PROMPT_UNITS_BASE = RU_PROMPT_NUMBERS_BASE + 113,
RU_PROMPT_POINT_BASE = RU_PROMPT_NUMBERS_BASE + 165, //.0 - .9
RU_PROMPT_FEMALE_ONE = RU_PROMPT_NUMBERS_BASE + 180,
RU_PROMPT_FEMALE_TWO = RU_PROMPT_NUMBERS_BASE + 190,
RU_PROMPT_THOUSAND1 = RU_PROMPT_NUMBERS_BASE+200, //1000
RU_PROMPT_THOUSAND2 = RU_PROMPT_NUMBERS_BASE+201, //2000
RU_PROMPT_THOUSAND5 = RU_PROMPT_NUMBERS_BASE+202, //5000
};
#define MALE 0x00
#define FEMALE 0x01
#define RU_FEMALE_UNIT 0xFF
#if defined(VOICE)
#if defined(CPUARM)
#define RU_PUSH_UNIT_PROMPT(u, p) ru_pushUnitPrompt((u), (p), id)
#else
#define RU_PUSH_UNIT_PROMPT(u, p) pushUnitPrompt((u), (p))
#endif
I18N_PLAY_FUNCTION(ru, pushUnitPrompt, uint8_t unitprompt, int16_t number)
{
#if defined(CPUARM)
if (number < 0){ // if negative number, we have to use 2 units form (for example value = 1.3)
PUSH_UNIT_PROMPT(unitprompt, 2);
}
else{
int16_t mod10 = number % 10;
if (number == 0)
PUSH_UNIT_PROMPT(unitprompt, 0);
else if (number == 1)
PUSH_UNIT_PROMPT(unitprompt, 1);
else if (number>=2 && number <=4)
PUSH_UNIT_PROMPT(unitprompt, 2);
else if (number>=5 && number <=20)
PUSH_UNIT_PROMPT(unitprompt, 5);
else if (mod10 == 1)
PUSH_UNIT_PROMPT(unitprompt, 1);
else if (mod10 >= 2 && mod10 <=4)
PUSH_UNIT_PROMPT(unitprompt, 2);
else
PUSH_UNIT_PROMPT(unitprompt, 5);
}
#else
// TODO: add rules for Russian language
unitprompt = RU_PROMPT_UNITS_BASE + unitprompt*4;
if (number == 1)
PUSH_NUMBER_PROMPT(unitprompt);
else
PUSH_NUMBER_PROMPT(unitprompt+1);
#endif
}
I18N_PLAY_FUNCTION(ru, playNumber, getvalue_t number, uint8_t unit, uint8_t att)
{
if (number < 0) {
PUSH_NUMBER_PROMPT(RU_PROMPT_MINUS);
number = -number;
}
#if !defined(CPUARM)
if (unit) {
unit--;
convertUnit(number, unit);
if (IS_IMPERIAL_ENABLE()) {
if (unit == UNIT_DIST) {
unit = UNIT_FEET;
}
if (unit == UNIT_SPEED) {
unit = UNIT_KTS;
}
}
unit++;
}
#endif
div_t qr = div((int)number, 10);
int8_t mode = MODE(att);
if (mode > 0 && att != RU_FEMALE_UNIT) {
#if defined(CPUARM)
if (mode == 2) {
number /= 10;
}
#else
// we assume that we are PREC1
#endif
if (qr.rem) {
PLAY_NUMBER(qr.quot, 0, 0);
PUSH_NUMBER_PROMPT(RU_PROMPT_POINT_BASE + qr.rem);
number = -1;
}
else {
number = qr.quot;
}
}
int16_t tmp = number;
if (number >= 1000) {
PLAY_NUMBER(number / 1000, RU_FEMALE_UNIT, 0); // female
uint8_t thousands = number / 1000;
int16_t mod10 = thousands % 10;
if (thousands == 1)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND1);
else if (thousands>=2 && thousands <=4)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND2);
else if (thousands>=5 && thousands <=20)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND5);
else if (mod10 == 1)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND1);
else if (mod10 >= 2 && mod10 <=4)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND2);
else
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND5);
number %= 1000;
if (number == 0)
number = -1;
}
if (number >= 100) {
PUSH_NUMBER_PROMPT(RU_PROMPT_HUNDRED + (number/100)-1);
number %= 100;
if (number == 0)
number = -1;
}
if (number >= 0) {
uint8_t attr = MALE;
switch(unit) {
case RU_FEMALE_UNIT:
case UNIT_MPH:
case UNIT_FLOZ:
case UNIT_MINUTES:
case UNIT_SECONDS:
attr = FEMALE;
break;
default:
attr = MALE;
break;
}
uint8_t lastDigit = number % 10;
uint8_t ten=(number - (number % 10))/10;
if (lastDigit == 1 && number != 11 && attr == FEMALE)
PUSH_NUMBER_PROMPT(RU_PROMPT_FEMALE_ONE + ten);
else if (lastDigit == 2 && number !=12 && attr == FEMALE)
PUSH_NUMBER_PROMPT(RU_PROMPT_FEMALE_TWO + ten);
else
PUSH_NUMBER_PROMPT(RU_PROMPT_ZERO + number);
}
if (unit) {
if (mode > 0 && qr.rem) // number with decimal point
RU_PUSH_UNIT_PROMPT(unit, -1); // force 2 units form, if float value
else
RU_PUSH_UNIT_PROMPT(unit, tmp);
}
}
I18N_PLAY_FUNCTION(ru, playDuration, int seconds PLAY_DURATION_ATT)
{
if (seconds == 0) {
PLAY_NUMBER(seconds, 0, 0);
return;
}
if (seconds < 0) {
PUSH_NUMBER_PROMPT(RU_PROMPT_MINUS);
seconds = -seconds;
}
uint8_t tmp = seconds / 3600;
seconds %= 3600;
if (tmp > 0 || IS_PLAY_TIME()) {
PLAY_NUMBER(tmp, UNIT_HOURS, 0);
}
tmp = seconds / 60;
seconds %= 60;
if (tmp > 0) {
PLAY_NUMBER(tmp, UNIT_MINUTES, 0);
if (seconds > 0)
PUSH_NUMBER_PROMPT(RU_PROMPT_AND);
}
if (seconds > 0) {
PLAY_NUMBER(seconds, UNIT_SECONDS, 0);
}
}
LANGUAGE_PACK_DECLARE(ru, "Russian");
#endif
+5 -10
View File
@@ -245,8 +245,7 @@ options_taranis = {
"internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"),
"shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"),
"eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"),
"multimodule": ("MULTIMODULE", "YES", "NO"),
"bindopt": ("BINDING_OPTIONS", "YES", "NO")
"multimodule": ("MULTIMODULE", "YES", "NO")
}
options_taranisplus = {
@@ -263,8 +262,7 @@ options_taranisplus = {
"internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"),
"shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"),
"eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"),
"multimodule": ("MULTIMODULE", "YES", "NO"),
"bindopt": ("BINDING_OPTIONS", "YES", "NO")
"multimodule": ("MULTIMODULE", "YES", "NO")
}
options_taranisx9e = {
@@ -282,8 +280,7 @@ options_taranisx9e = {
"shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"),
"eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"),
"horussticks": ("STICKS", "HORUS", "STANDARD"),
"multimodule": ("MULTIMODULE", "YES", "NO"),
"bindopt": ("BINDING_OPTIONS", "YES", "NO")
"multimodule": ("MULTIMODULE", "YES", "NO")
}
options_x12s = {
@@ -297,8 +294,7 @@ options_x12s = {
"nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"),
"eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"),
"multimodule": ("MULTIMODULE", "YES", "NO"),
"pcbdev": ("PCBREV", "10", None),
"bindopt": ("BINDING_OPTIONS", "YES", "NO")
"pcbdev": ("PCBREV", "10", None)
}
options_x10 = {
@@ -311,6 +307,5 @@ options_x10 = {
"faichoice": ("FAI", "CHOICE", None),
"nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"),
"eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"),
"multimodule": ("MULTIMODULE", "YES", "NO"),
"bindopt": ("BINDING_OPTIONS", "YES", "NO")
"multimodule": ("MULTIMODULE", "YES", "NO")
}
+272
View File
@@ -0,0 +1,272 @@
SYSTEM|0000|0
SYSTEM|0001|1
SYSTEM|0002|2
SYSTEM|0003|3
SYSTEM|0004|4
SYSTEM|0005|5
SYSTEM|0006|6
SYSTEM|0007|7
SYSTEM|0008|8
SYSTEM|0009|9
SYSTEM|0010|10
SYSTEM|0011|11
SYSTEM|0012|12
SYSTEM|0013|13
SYSTEM|0014|14
SYSTEM|0015|15
SYSTEM|0016|16
SYSTEM|0017|17
SYSTEM|0018|18
SYSTEM|0019|19
SYSTEM|0020|20
SYSTEM|0021|21
SYSTEM|0022|22
SYSTEM|0023|23
SYSTEM|0024|24
SYSTEM|0025|25
SYSTEM|0026|26
SYSTEM|0027|27
SYSTEM|0028|28
SYSTEM|0029|29
SYSTEM|0030|30
SYSTEM|0031|31
SYSTEM|0032|32
SYSTEM|0033|33
SYSTEM|0034|34
SYSTEM|0035|35
SYSTEM|0036|36
SYSTEM|0037|37
SYSTEM|0038|38
SYSTEM|0039|39
SYSTEM|0040|40
SYSTEM|0041|41
SYSTEM|0042|42
SYSTEM|0043|43
SYSTEM|0044|44
SYSTEM|0045|45
SYSTEM|0046|46
SYSTEM|0047|47
SYSTEM|0048|48
SYSTEM|0049|49
SYSTEM|0050|50
SYSTEM|0051|51
SYSTEM|0052|52
SYSTEM|0053|53
SYSTEM|0054|54
SYSTEM|0055|55
SYSTEM|0056|56
SYSTEM|0057|57
SYSTEM|0058|58
SYSTEM|0059|59
SYSTEM|0060|60
SYSTEM|0061|61
SYSTEM|0062|62
SYSTEM|0063|63
SYSTEM|0064|64
SYSTEM|0065|65
SYSTEM|0066|66
SYSTEM|0067|67
SYSTEM|0068|68
SYSTEM|0069|69
SYSTEM|0070|70
SYSTEM|0071|71
SYSTEM|0072|72
SYSTEM|0073|73
SYSTEM|0074|74
SYSTEM|0075|75
SYSTEM|0076|76
SYSTEM|0077|77
SYSTEM|0078|78
SYSTEM|0079|79
SYSTEM|0080|80
SYSTEM|0081|81
SYSTEM|0082|82
SYSTEM|0083|83
SYSTEM|0084|84
SYSTEM|0085|85
SYSTEM|0086|86
SYSTEM|0087|87
SYSTEM|0088|88
SYSTEM|0089|89
SYSTEM|0090|90
SYSTEM|0091|91
SYSTEM|0092|92
SYSTEM|0093|93
SYSTEM|0094|94
SYSTEM|0095|95
SYSTEM|0096|96
SYSTEM|0097|97
SYSTEM|0098|98
SYSTEM|0099|99
SYSTEM|0100|100
SYSTEM|0101|200
SYSTEM|0102|300
SYSTEM|0103|400
SYSTEM|0104|500
SYSTEM|0105|600
SYSTEM|0106|700
SYSTEM|0107|800
SYSTEM|0108|900
SYSTEM|0109|1000
SYSTEM|0110|č
SYSTEM|0111|ěčíóń
SYSTEM|0112|
SYSTEM|0165|đîâíî
SYSTEM|0166|č îäíŕ äĺń˙ňŕ˙
SYSTEM|0167|č äâĺ äĺń˙ňűő
SYSTEM|0168|č ňđč äĺń˙ňűő
SYSTEM|0169|č ÷ĺňűđĺ äĺń˙ňűő
SYSTEM|0170|č ď˙ňü äĺń˙ňűő
SYSTEM|0171|č řĺńňü äĺń˙ňűő
SYSTEM|0172|č ńĺěü äĺń˙ňűő
SYSTEM|0173|č âîńĺěü äĺń˙ňűő
SYSTEM|0174|č äĺâ˙ňü äĺń˙ňűő
SYSTEM|volt0|âîëüň
SYSTEM|volt1|âîëüň
SYSTEM|volt2|âîëüňŕ
SYSTEM|volt5|âîëüň
SYSTEM|amp0|ŕěďĺđ
SYSTEM|amp1|ŕěďĺđ
SYSTEM|amp2|ŕěďĺđŕ
SYSTEM|amp5|ŕěďĺđ
SYSTEM|mamp0|ěčëëčŕěďĺđ
SYSTEM|mamp1|ěčëëčŕěďĺđ
SYSTEM|mamp2|ěčëëčŕěďĺđŕ
SYSTEM|mamp5|ěčëëčŕěďĺđ
SYSTEM|knot0|óçëîâ
SYSTEM|knot1|óçĺë
SYSTEM|knot2|óçëŕ
SYSTEM|knot5|óçëîâ
SYSTEM|mps0|ěĺňđîâ â ńĺęóíäó
SYSTEM|mps1|ěĺňđ â ńĺęóíäó
SYSTEM|mps2|ěĺňđŕ â ńĺęóíäó
SYSTEM|mps5|ěĺňđîâ â ńĺęóíäó
SYSTEM|celsius0|ăđŕäóńîâ
SYSTEM|celsius1|ăđŕäóń
SYSTEM|celsius2|ăđŕäóńŕ
SYSTEM|celsius5|ăđŕäóńîâ
SYSTEM|db0|äĺöčáĺë
SYSTEM|db1|äĺöčáĺë
SYSTEM|db2|äĺöčáĺëŕ
SYSTEM|db5|äĺöčáĺë
SYSTEM|degree0|ăđŕäóńîâ
SYSTEM|degree1|ăđŕäóń
SYSTEM|degree2|ăđŕäóńŕ
SYSTEM|degree5|ăđŕäóńîâ
SYSTEM|fahr0|ăđŕäóńîâ ďî ôŕđĺíăĺéňó
SYSTEM|fahr1|ăđŕäóń ďî ôŕđĺíăĺéňó
SYSTEM|fahr2|ăđŕäóńŕ ďî ôŕđĺíăĺéňó
SYSTEM|fahr5|ăđŕäóńîâ ďî ôŕđĺíăĺéňó
SYSTEM|foot0|ôóňîâ
SYSTEM|foot1|ôóň
SYSTEM|foot2|ôóňŕ
SYSTEM|foot5|ôóňîâ
SYSTEM|founce0|óíöčé
SYSTEM|founce1|óíöč˙
SYSTEM|founce2|óíöčč
SYSTEM|founce5|óíöčé
SYSTEM|fps0|ôóňîâ â ńĺęóíäó
SYSTEM|fps1|ôóň â ńĺęóíäó
SYSTEM|fps2|ôóňŕ â ńĺęóíäó
SYSTEM|fps5|ôóňîâ â ńĺęóíäó
SYSTEM|g0|äćč
SYSTEM|g1|äćč
SYSTEM|g2|äćč
SYSTEM|g5|äćč
SYSTEM|hour0|÷ŕńîâ
SYSTEM|hour1|÷ŕń
SYSTEM|hour2|÷ŕńŕ
SYSTEM|hour5|÷ŕńîâ
SYSTEM|kph0|ęčëîěĺňđîâ â ÷ŕń
SYSTEM|kph1|ęčëîěĺňđ â ÷ŕń
SYSTEM|kph2|ęčëîěĺňđŕ â ÷ŕń
SYSTEM|kph5|ęčëîěĺňđîâ â ÷ŕń
SYSTEM|mamph0|ěčëëčŕěďĺđ â ÷ŕń
SYSTEM|mamph1|ěčëëčŕěďĺđ â ÷ŕń
SYSTEM|mamph2|ěčëëčŕěďĺđŕ â ÷ŕń
SYSTEM|mamph5|ěčëëčŕěďĺđ â ÷ŕń
SYSTEM|meter0|ěĺňđîâ
SYSTEM|meter1|ěĺňđ
SYSTEM|meter2|ěĺňđŕ
SYSTEM|meter5|ěĺňđîâ
SYSTEM|minute0|ěčíóň
SYSTEM|minute1|ěčíóňŕ
SYSTEM|minute2|ěčíóňű
SYSTEM|minute5|ěčíóň
SYSTEM|ml0|ěčëëčëčňđîâ
SYSTEM|ml1|ěčëëčëčňđ
SYSTEM|ml2|ěčëëčëčňđŕ
SYSTEM|ml5|ěčëëčëčňđîâ
SYSTEM|mph0|ěčëü â ÷ŕń
SYSTEM|mph1|ěčë˙ â ÷ŕń
SYSTEM|mph2|ěčëč â ÷ŕń
SYSTEM|mph5|ěčëü â ÷ŕń
SYSTEM|mwatt0|ěčëëčâŕňň
SYSTEM|mwatt1|ěčëëčâŕňň
SYSTEM|mwatt2|ěčëëčâŕňňŕ
SYSTEM|mwatt5|ěčëëčâŕňň
SYSTEM|percent0|ďđîöĺíňîâ
SYSTEM|percent1|ďđîöĺíň
SYSTEM|percent2|ďđîöĺíňŕ
SYSTEM|percent5|ďđîöĺíňîâ
SYSTEM|radian0|đŕäčŕí
SYSTEM|radian1|đŕäčŕí
SYSTEM|radian2|đŕäčŕíŕ
SYSTEM|radian5|đŕäčŕí
SYSTEM|rpm0|îáîđîňîâ â ěčíóňó
SYSTEM|rpm1|îáîđîň â ěčíóňó
SYSTEM|rpm2|îáîđîňŕ â ěčíóňó
SYSTEM|rpm5|îáîđîňîâ â ěčíóňó
SYSTEM|second0|ńĺęóíä
SYSTEM|second1|ńĺęóíäŕ
SYSTEM|second2|ńĺęóíäű
SYSTEM|second5|ńĺęóíä
SYSTEM|watt0|âŕňň
SYSTEM|watt1|âŕňň
SYSTEM|watt2|âŕňňŕ
SYSTEM|watt5|âŕňň
SYSTEM|eebad|Îřčáęŕ ďŕě˙ňč
SYSTEM|hello|Ňŕęč çäđŕâńňâóéňĺ!
SYSTEM|inactiv|ß ňóň! Ďđî ěĺí˙ çŕáűëč!
SYSTEM|lowbatt|Ŕęęóěóë˙ňîđ đŕçđ˙ćĺí
SYSTEM|maxtrim|Ňđčěěĺđ ěŕęńčěóě
SYSTEM|midtrim|Ňđčěěĺđ ďî öĺíňđó
SYSTEM|mintrim|Ňđčěěĺđ ěčíčěóě
SYSTEM|rssi_org|Ńëŕáűé ńčăíŕë!
SYSTEM|rssi_red|Î÷ĺíü ńëŕáűé ńčăíŕë!
SYSTEM|rxko|
SYSTEM|sensorko|Ńĺíńîđ îňęëţ÷ĺí
SYSTEM|servoko|
SYSTEM|swalert|Ďđîâĺđü ňóěáëĺđű!
SYSTEM|swr_red|Ďđîáëĺěű ń ŕíňĺííîé ďĺđĺäŕň÷čęŕ!
SYSTEM|telemko|Ďîňĺđ˙í ńčăíŕë ňĺëĺěĺňđčč
SYSTEM|telemok|Ňĺëĺěĺňđč˙ âîńńňŕíîâëĺíŕ
SYSTEM|thralert|Óáĺđč ăŕç!
SYSTEM|timovr1|Ňŕéěĺđ 1. Âđĺě˙ âűřëî
SYSTEM|timovr2|Ňŕéěĺđ 2. Âđĺě˙ âűřëî
SYSTEM|timovr3|Ňŕéěĺđ 3. Âđĺě˙ âűřëî
SYSTEM|trainko|Ňđĺíĺđńęčé ńčăíŕë ďîňĺđ˙í
SYSTEM|trainok|Ďî˙âčëń˙ ňđĺíĺđńęčé ńčăíŕë
SYSTEM|0180|îäíŕ
SYSTEM|0181|îäčííŕäöŕňü
SYSTEM|0182|äâŕäöŕňü îäíŕ
SYSTEM|0183|ňđčäöŕňü îäíŕ
SYSTEM|0184|ńîđîę îäíŕ
SYSTEM|0185|ď˙ňüäĺń˙ň îäíŕ
SYSTEM|0186|řĺńňüäĺń˙ň îäíŕ
SYSTEM|0187|ńĺěüäĺń˙ň îäíŕ
SYSTEM|0188|âîńĺěüäĺń˙ň îäíŕ
SYSTEM|0189|äĺâ˙íîńňî îäíŕ
SYSTEM|0190|äâĺ
SYSTEM|0191|äâĺíŕäöŕňü
SYSTEM|0192|äâŕäöŕňü äâĺ
SYSTEM|0193|ňđčäöŕňü äâĺ
SYSTEM|0194|ńîđîę äâĺ
SYSTEM|0195|ď˙ňüäĺń˙ň äâĺ
SYSTEM|0196|řĺńňüäĺń˙ň äâĺ
SYSTEM|0197|ńĺěüäĺń˙ň äâĺ
SYSTEM|0198|âîńĺěüäĺń˙ň äâĺ
SYSTEM|0199|äĺâ˙íîńňî äâĺ
SYSTEM|0200|ňűń˙÷ŕ
SYSTEM|0201|ňűń˙÷č
SYSTEM|0202|ňűń˙÷
+1 -1
View File
@@ -34,7 +34,7 @@ docker exec companion rm -rf build
if [ ! -f ${output}/companion/linux/companion22_${version}${suffix}_amd64.deb ]; then
docker exec companion /opentx/code/tools/build-companion-release.sh /opentx/code /opentx/binaries/
docker exec companion sh -c "cp /build/radio/src/lua/*.txt /opentx/binaries"
cp -f binaries/*.deb ${output}/companion/linux/companion22_${version}_amd64.deb
cp -f binaries/*.deb ${output}/companion/linux/companion22_${version}${suffix}_amd64.deb
cp -f binaries/lua_fields_*.txt ${output}/firmware
fi
docker stop companion
+3 -3
View File
@@ -52,8 +52,8 @@ else
mkdir ${workdir}/sdcard/taranis-x7/SOUNDS
cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis-x9/
cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis-x7/
cd ${workdir}/sdcard/horus && zip -r ${output}/x12/sdcard-horus-${sdcard_version}.zip *
cd ${workdir}/sdcard/taranis-x9 && zip -r ${output}/x9/sdcard-taranis-x9-${sdcard_version}.zip *
cd ${workdir}/sdcard/taranis-x7 && zip -r ${output}/x7/sdcard-taranis-x7-${sdcard_version}.zip *
cd ${workdir}/sdcard/horus && zip -r ${output}/opentx-x12s/sdcard-horus-${sdcard_version}.zip *
cd ${workdir}/sdcard/taranis-x9 && zip -r ${output}/opentx-x9d/sdcard-taranis-x9-${sdcard_version}.zip *
cd ${workdir}/sdcard/taranis-x7 && zip -r ${output}/opentx-x7/sdcard-taranis-x7-${sdcard_version}.zip *
rm -Rf ${workdir}/sdcard
fi
+1 -1
View File
@@ -6,7 +6,7 @@ branch=2.2
docker=release22
workdir=/home/opentx/release22
output=/var/www/html/2.2
version=2.2.0
version=2.2.1
cd ${workdir}