diff --git a/CMakeLists.txt b/CMakeLists.txt index c31e39426..38b98255a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "0") 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 "0028") +set(SDCARD_REVISION "0029") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) diff --git a/CREDITS.txt b/CREDITS.txt index b7ce3cb68..4fcf98a29 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1733,3 +1733,31 @@ MeCodeGoodSomeday Timothy Fry John Beech Wojciech Winiarski +Armin Kuepfer +Alain Bregand +James Thompson +Dautremépuis Benoit +Adriano Emanuele Figliola +Stefano Bortolotti +Gerald Zierer +Alessio Noto +Walter Fowler +Robert Black +Klaus Kernstock +Michael Wittich +AG-Software +Dietmar Drees +Winfried Goers +Steve Schoonover +N. Haasnoot (monthly) +Wolfram Bahmann +Florian Reck +Gary Bancroft +Karl-Heinz Behn +Stuart Godsmark +Josko Povse +David Reese +Paul Pearson +Stuart Olson +Pierre Connan +Henk Eeltink diff --git a/companion/src/downloaddialog.cpp b/companion/src/downloaddialog.cpp index 3f70e6529..5b9b2dfa0 100644 --- a/companion/src/downloaddialog.cpp +++ b/companion/src/downloaddialog.cpp @@ -54,7 +54,7 @@ DownloadDialog::DownloadDialog(QWidget *parent, QString src, QString tgt): reply = qnam.get(QNetworkRequest(QUrl(src))); connect(reply, SIGNAL(finished()), this, SLOT(httpFinished())); connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead())); - connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(updateDataReadProgress(qint64,qint64))); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateDataReadProgress(qint64, qint64))); } } @@ -114,7 +114,7 @@ void DownloadDialog::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) void DownloadDialog::fileError() { delete file; - file = NULL; + file = nullptr; reject(); } diff --git a/companion/src/firmwares/adjustmentreference.cpp b/companion/src/firmwares/adjustmentreference.cpp index 37b284ecd..7181e15dd 100644 --- a/companion/src/firmwares/adjustmentreference.cpp +++ b/companion/src/firmwares/adjustmentreference.cpp @@ -45,15 +45,12 @@ AdjustmentReference::AdjustmentReference(AdjustRefType type, int value) bool AdjustmentReference::isValid(const int value) const { - switch(type) { + switch (type) { case ADJUST_REF_VALUE: - if (abs(value) < ADJUST_REF_GVAR_BASE) - return true; - break; + return abs(value) < ADJUST_REF_GVAR_BASE; + case ADJUST_REF_GVAR: - if (abs(value) > 0 && abs(value) <= CPN_MAX_GVARS); - return true; - break; + return abs(value) > 0 && abs(value) <= CPN_MAX_GVARS; } return false; } diff --git a/companion/src/firmwares/io_data.h b/companion/src/firmwares/io_data.h index 05136f210..b70b174ea 100644 --- a/companion/src/firmwares/io_data.h +++ b/companion/src/firmwares/io_data.h @@ -109,7 +109,8 @@ class LimitData { int offset; int ppmCenter; bool symetrical; - char name[LIMITDATA_NAME_LEN+1]; + int failsafe; + char name[LIMITDATA_NAME_LEN + 1]; CurveReference curve; QString minToString() const; QString maxToString() const; diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index b72cc328a..3386ba41d 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -1174,8 +1174,7 @@ void ModelData::updateModuleFailsafes(ModuleData * md) bool updated = false; - switch (updRefInfo.action) - { + switch (updRefInfo.action) { case REF_UPD_ACT_CLEAR: break; case REF_UPD_ACT_SHIFT: @@ -1183,16 +1182,16 @@ void ModelData::updateModuleFailsafes(ModuleData * md) return; if (updRefInfo.shift > 0) { - for (int i = (CPN_MAX_CHNOUT - 1); i > updRefInfo.index1; i--) { - md->failsafeChannels[i] = md->failsafeChannels[i - 1]; + for (int i = CPN_MAX_CHNOUT - 1; i > updRefInfo.index1; i--) { + limitData[i].failsafe = limitData[i - 1].failsafe; } - md->failsafeChannels[updRefInfo.index1] = 0; + limitData[updRefInfo.index1].failsafe = 0; } else { - for (int i = (updRefInfo.index1 + 1); i < (CPN_MAX_CHNOUT - 1); i++) { - md->failsafeChannels[i - 1] = md->failsafeChannels[i]; + for (int i = updRefInfo.index1 + 1; i < CPN_MAX_CHNOUT - 1; i++) { + limitData[i - 1].failsafe = limitData[i].failsafe; } - md->failsafeChannels[CPN_MAX_CHNOUT - 1] = 0; + limitData[CPN_MAX_CHNOUT - 1].failsafe = 0; } updated = true; break; @@ -1200,17 +1199,18 @@ void ModelData::updateModuleFailsafes(ModuleData * md) int tmp; if (updRefInfo.index1 >= 0 && updRefInfo.index1 < CPN_MAX_CHNOUT) { updated = true; - tmp = md->failsafeChannels[updRefInfo.index1]; + tmp = limitData[updRefInfo.index1].failsafe; if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) - md->failsafeChannels[updRefInfo.index1] = md->failsafeChannels[updRefInfo.index2]; + limitData[updRefInfo.index1].failsafe = limitData[updRefInfo.index2].failsafe; else - md->failsafeChannels[updRefInfo.index1] = 0; + limitData[updRefInfo.index1].failsafe = 0; } else tmp = 0; - if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) + if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) { updated = true; - md->failsafeChannels[updRefInfo.index2] = tmp; + limitData[updRefInfo.index2].failsafe = tmp; + } break; default: qDebug() << "Error - unhandled action:" << updRefInfo.action; diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 1df7380a1..86614b392 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -132,7 +132,8 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_ESKY150V2, MODULE_SUBTYPE_MULTI_DSM_RX, MODULE_SUBTYPE_MULTI_JJRC345, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_JJRC345 + MODULE_SUBTYPE_MULTI_Q90C, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_Q90C }; enum TrainerProtocol { @@ -158,7 +159,11 @@ class ModuleData { Q_DECLARE_TR_FUNCTIONS(ModuleData) public: - ModuleData() { clear(); } + ModuleData() + { + clear(); + } + unsigned int modelId; unsigned int protocol; // type in datastructs.h int rfProtocol; // rfProtocol in datastructs.h @@ -168,7 +173,6 @@ class ModuleData { unsigned int channelsStart; int channelsCount; // 0=8 channels unsigned int failsafeMode; - int failsafeChannels[CPN_MAX_CHNOUT]; struct PPM { int delay; diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 4feeb997f..737bd36ed 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -50,7 +50,7 @@ static const QStringList STR_SUBTYPE_SYMAX {"Standard", "Syma X5C"}; static const QStringList STR_SUBTYPE_SLT {"V1 (6 Channel)", "V2 (8 Channel)", "Q100", "Q200", "MR100"}; static const QStringList STR_SUBTYPE_CX10 {"Green", "Blue", "DM007", "-", "JC3015a", "JC3015b", "MK33041"}; static const QStringList STR_SUBTYPE_CG023 {"Standard", "YD829"}; -static const QStringList STR_SUBTYPE_BAYANG {"Standard", "H8S3D", "X16 AH", "IRDRONE", "DHD D4"}; +static const QStringList STR_SUBTYPE_BAYANG {"Standard", "H8S3D", "X16 AH", "IRDRONE", "DHD D4", "QX100"}; static const QStringList STR_SUBTYPE_ESky {"Standard", "ET4"}; static const QStringList STR_SUBTYPE_MT99 {"MT99", "H7", "YZ", "LS", "FY805"}; static const QStringList STR_SUBTYPE_MJXQ {"WLH08", "X600", "X800", "H26D", "E010", "H26WH", "Phoenix"}; @@ -76,7 +76,9 @@ static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly"}; static const QStringList STR_SUBTYPE_ZSX {"JJRC ZSX-280"}; static const QStringList STR_SUBTYPE_FLYZONE {"FZ-410 TX"}; static const QStringList STR_SUBTYPE_FRSKYX_RX {"RX", "Clone TX"}; +static const QStringList STR_SUBTYPE_HOTT {"Sync", "No_Sync"}; static const QStringList STR_SUBTYPE_FX816 {"P38"}; +static const QStringList STR_SUBTYPE_PELIKAN {"Pro", "Lite"}; static const QStringList STR_SUBTYPE_XK {"X450", "X420"}; static const QStringList STR_SUBTYPE_XN297DUMP {"250K", "1M", "2M", "AUTO"}; static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch", "D16 Cloned"}; @@ -104,7 +106,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_SLT, 4, false, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_CX10, 6, false, STR_SUBTYPE_CX10, nullptr}, {MODULE_SUBTYPE_MULTI_CG023, 1, false, STR_SUBTYPE_CG023, nullptr}, - {MODULE_SUBTYPE_MULTI_BAYANG, 4, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, {MODULE_SUBTYPE_MULTI_ESky, 1, false, STR_SUBTYPE_ESky, nullptr}, {MODULE_SUBTYPE_MULTI_MT99XX, 4, false, STR_SUBTYPE_MT99, nullptr}, {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, STR_SUBTYPE_MJXQ, STR_MULTI_RFTUNE}, @@ -134,8 +136,9 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_ZSX, 0, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, STR_SUBTYPE_FLYZONE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HOTT, 1, true, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_PELIKAN, 1, false, STR_SUBTYPE_PELIKAN, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, STR_SUBTYPE_XN297DUMP, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, @@ -144,6 +147,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_Q90C, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {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) @@ -188,7 +192,7 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", "KFPlan KF606", "Redpine", "Potensic", "ZSX", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", "Bayang RX", "Pelikan", "Tiger", "XK", "XN297 Dump", "FrSky X 2.1", "FrSky R9", "Propel", "FrSky L", "Skyartec", - "ESky 150v2", "DSM RX", "JJRC345" + "ESky 150v2", "DSM RX", "JJRC345", "Q90C" }); return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index f2275fe61..17c5b03a5 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -128,7 +128,7 @@ inline int SWITCHES_CONFIG_SIZE(Board::Type board, int version) return 16; } -#define MAX_ROTARY_ENCODERS(board) (IS_SKY9X(board) ? 1 : 0) +#define MAX_ROTARY_ENCODERS(board) 0 #define MAX_FLIGHT_MODES(board, version) 9 #define MAX_TIMERS(board, version) 3 #define MAX_MIXERS(board, version) 64 @@ -1880,7 +1880,7 @@ class CustomScreenField: public StructField { class SensorField: public TransformedField { public: - SensorField(DataField * parent, const ModelData& model, SensorData & sensor, Board::Type board, unsigned int version): + SensorField(DataField * parent, const ModelData & model, SensorData & sensor, Board::Type board, unsigned int version): TransformedField(parent, internalField), internalField(this, "Sensor"), sensor(sensor), @@ -1948,16 +1948,9 @@ class SensorField: public TransformedField { else { sensor.id = _id; sensor.subid = _subid; - if (model.moduleData[0].isPxx1Module() || model.moduleData[1].isPxx1Module()) { - sensor.instance = (_instance & 0x1F) + (version <= 218 ? 0 : 1); // 5 bits instance - sensor.rxIdx = 0x03; // 2 bits Rx idx - sensor.moduleIdx = 0x01; // 1 bit module idx - } - else { - sensor.instance = (_instance & 0x1F) + 1; - sensor.rxIdx = (_instance >> 5) & 0x03; // 2 bits Rx idx - sensor.moduleIdx = (_instance >> 7) & 0x1; // 1 bit module idx - } + sensor.instance = (_instance & 0x1F) + (version <= 218 ? 0 : 1); // 5 bits instance + sensor.rxIdx = (_instance >> 5) & 0x03; // 2 bits Rx idx + sensor.moduleIdx = (_instance >> 7) & 0x1; // 1 bit module idx sensor.ratio = _ratio; sensor.offset = _offset; } @@ -1983,6 +1976,12 @@ class SensorField: public TransformedField { sensor.unit++; } + if (version < 219) { + if (sensor.unit > SensorData::UNIT_FLOZ) { + sensor.unit += 11; + } + } + qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName()); } @@ -2185,7 +2184,7 @@ class ModuleUnionField: public UnionField { class ModuleField: public TransformedField { public: - ModuleField(DataField * parent, ModuleData & module, Board::Type board, unsigned int version): + ModuleField(DataField * parent, ModuleData & module, ModelData & model, Board::Type board, unsigned int version): TransformedField(parent, internalField), internalField(this, "Module"), module(module), @@ -2199,8 +2198,8 @@ class ModuleField: public TransformedField { internalField.Append(new UnsignedField<3>(this, module.subType)); internalField.Append(new BoolField<1>(this, module.invertedSerial)); if (version <= 218) { - for (int i=0; i<32; i++) { - internalField.Append(new SignedField<16>(this, module.failsafeChannels[i])); + for (int i = 0; i < 32; i++) { + internalField.Append(new SignedField<16>(this, model.limitData[i].failsafe)); } } @@ -2394,12 +2393,12 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig int modulesCount = (version <= 218 ? 3 : 2); for (int module = 0; module < modulesCount; module++) { - internalField.Append(new ModuleField(this, modelData.moduleData[module], board, version)); + internalField.Append(new ModuleField(this, modelData.moduleData[module], modelData, board, version)); } if (version >= 219) { for (int i = 0; i < 32; i++) { - internalField.Append(new SignedField<16>(this, modelData.moduleData[0].failsafeChannels[i])); + internalField.Append(new SignedField<16>(this, modelData.limitData[i].failsafe)); } } diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 150352da8..2fed78ab4 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1218,11 +1218,6 @@ void addOpenTxTaranisOptions(OpenTxFirmware * firmware) addOpenTxFontOptions(firmware); } -void addPPMInternalModuleHack(OpenTxFirmware * firmware) -{ - firmware->addOption("internalppm", Firmware::tr("Support for PPM internal module hack")); -} - void addOpenTxArm9xOptions(OpenTxFirmware * firmware, bool dblkeys = true) { addOpenTxCommonOptions(firmware); @@ -1249,7 +1244,6 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware("opentx-x9d+", Firmware::tr("FrSky Taranis X9D+"), BOARD_TARANIS_X9DP); firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)")); addOpenTxTaranisOptions(firmware); - addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); @@ -1264,7 +1258,6 @@ void registerOpenTxFirmwares() firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)")); firmware->addOption("haptic", Firmware::tr("Haptic module installed")); addOpenTxTaranisOptions(firmware); - addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); @@ -1273,7 +1266,6 @@ void registerOpenTxFirmwares() firmware->addOption("shutdownconfirm", Firmware::tr("Confirmation before radio shutdown")); firmware->addOption("horussticks", Firmware::tr("Horus gimbals installed (Hall sensors)")); addOpenTxTaranisOptions(firmware); - addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); diff --git a/companion/src/firmwares/sensordata.h b/companion/src/firmwares/sensordata.h index 65a8a4957..3f995ea3e 100644 --- a/companion/src/firmwares/sensordata.h +++ b/companion/src/firmwares/sensordata.h @@ -74,10 +74,13 @@ class SensorData { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, UNIT_KMH, + UNIT_SPEED = UNIT_KMH, UNIT_MPH, UNIT_METERS, + UNIT_DIST = UNIT_METERS, UNIT_FEET, UNIT_CELSIUS, + UNIT_TEMPERATURE = UNIT_CELSIUS, UNIT_FAHRENHEIT, UNIT_PERCENT, UNIT_MAH, @@ -91,18 +94,30 @@ class SensorData { UNIT_MILLILITERS, UNIT_FLOZ, UNIT_MILLILITERS_PER_MINUTE, + UNIT_MAX = UNIT_MILLILITERS_PER_MINUTE, + UNIT_SPARE1, + UNIT_SPARE2, + UNIT_SPARE3, + UNIT_SPARE4, + UNIT_SPARE5, + UNIT_SPARE6, + UNIT_SPARE7, + UNIT_SPARE8, + UNIT_SPARE9, + UNIT_SPARE10, UNIT_HOURS, UNIT_MINUTES, UNIT_SECONDS, // FrSky format used for these fields, could be another format in the future - UNIT_FIRST_VIRTUAL, + UNIT_FIRST_VIRTUAL, UNIT_CELLS = UNIT_FIRST_VIRTUAL, UNIT_DATETIME, UNIT_GPS, + UNIT_BITFIELD, + UNIT_TEXT, + // Internal units (not stored in sensor unit) UNIT_GPS_LONGITUDE, UNIT_GPS_LATITUDE, - UNIT_GPS_LONGITUDE_EW, - UNIT_GPS_LATITUDE_NS, UNIT_DATETIME_YEAR, UNIT_DATETIME_DAY_MONTH, UNIT_DATETIME_HOUR_MIN, diff --git a/companion/src/flashfirmwaredialog.cpp b/companion/src/flashfirmwaredialog.cpp index 9a2b688ab..4650cd4c0 100644 --- a/companion/src/flashfirmwaredialog.cpp +++ b/companion/src/flashfirmwaredialog.cpp @@ -21,7 +21,6 @@ #include "flashfirmwaredialog.h" #include "ui_flashfirmwaredialog.h" #include "appdata.h" -#include "process_flash.h" #include "helpers.h" #include "progressdialog.h" #include "radiointerface.h" @@ -112,7 +111,7 @@ void FlashFirmwareDialog::updateUI() } QImage image; - switch(imageSource) { + switch (imageSource) { case FIRMWARE: ui->useFirmwareSplash->setChecked(true); image = firmware.getSplash(); @@ -202,7 +201,7 @@ void FlashFirmwareDialog::on_useExternalSplash_clicked() void FlashFirmwareDialog::on_useLibrarySplash_clicked() { QString fileName; - SplashLibraryDialog *ld = new SplashLibraryDialog(this, &fileName); + auto ld = new SplashLibraryDialog(this, &fileName); ld->exec(); if (!fileName.isEmpty()) { QImage image(fileName); diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index eb594b9b6..2b0f62503 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -565,7 +565,6 @@ QPixmap makePixMap(const QImage & image) return QPixmap::fromImage(result); } - int version2index(const QString & version) { int result = 999; @@ -581,6 +580,10 @@ int version2index(const QString & version) result = parts[1].toInt(); // nightly build up to 899 mainVersion = parts[0]; } + else if (version.contains("-")) { + parts = version.split("-"); + mainVersion = parts[0]; + } parts = mainVersion.split('.'); if (parts.size() > 2) result += 1000 * parts[2].toInt(); diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 2c230000b..4753e0b71 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -360,7 +360,6 @@ void MainWindow::checkForCompanionUpdateFinished(QNetworkReply * reply) return onUpdatesError(tr("Companion update check failed, new version information not found.")); int webVersion = version2index(version); - int ownVersion = version2index(VERSION); if (ownVersion < webVersion) { diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index a5220019e..806de54fc 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -643,7 +643,7 @@ void InputsPanel::cmInputSwapData(int idx1, int idx2) } // move expos up const int offset = i - expoidx; - int expocnt; + int expocnt = 0; for (int j = i; j < CPN_MAX_EXPOS; j++) { ExpoData *ed = &model->expoData[j]; if ((int)ed->chn == idx2) { diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index c813b0b9c..43eaf11fe 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -792,18 +792,22 @@ void ModulePanel::on_lowPower_stateChanged(int state) module.multi.lowPowerMode = (state == Qt::Checked); } -// updtSb (update spin box(es)): 0=none or bitmask of FailsafeValueDisplayTypes -void ModulePanel::setChannelFailsafeValue(const int channel, const int value, quint8 updtSb) +void ModulePanel::onFailsafeModified(unsigned channel) { - if (channel < 0 || channel >= CPN_MAX_CHNOUT) - return; + updateFailsafeUI(channel, FAILSAFE_DISPLAY_PERCENT | FAILSAFE_DISPLAY_USEC); +} - module.failsafeChannels[channel] = value; +void ModulePanel::updateFailsafeUI(unsigned channel, quint8 updtSb) +{ + int value = model->limitData[channel].failsafe; double pctVal = divRoundClosest(value * 1000, 1024) / 10.0; - // qDebug() << value << pctVal; if (failsafeGroupsMap.contains(channel)) { const ChannelFailsafeWidgetsGroup & grp = failsafeGroupsMap.value(channel); + bool disable = (value == FAILSAFE_CHANNEL_HOLD || value == FAILSAFE_CHANNEL_NOPULSE); + if (grp.combo) { + grp.combo->setCurrentIndex(grp.combo->findData(disable ? value : 0)); + } if ((updtSb & FAILSAFE_DISPLAY_PERCENT) && grp.sbPercent) { grp.sbPercent->blockSignals(true); grp.sbPercent->setValue(pctVal); @@ -815,8 +819,21 @@ void ModulePanel::setChannelFailsafeValue(const int channel, const int value, qu grp.sbUsec->blockSignals(false); } } - if (!lock) +} + +// updtSb (update spin box(es)): 0=none or bitmask of FailsafeValueDisplayTypes +void ModulePanel::setChannelFailsafeValue(const int channel, const int value, quint8 updtSb) +{ + if (channel < 0 || channel >= CPN_MAX_CHNOUT) + return; + + model->limitData[channel].failsafe = value; + updateFailsafeUI(channel, updtSb); + + if (!lock) { + emit failsafeModified(channel); emit modified(); + } } void ModulePanel::onFailsafeUsecChanged(int value) @@ -853,8 +870,9 @@ void ModulePanel::onFailsafeComboIndexChanged(int index) bool ok = false; int channel = sender()->property("index").toInt(&ok); if (ok) { - module.failsafeChannels[channel] = cb->itemData(index).toInt(); + model->limitData[channel].failsafe = cb->itemData(index).toInt(); updateFailsafe(channel); + emit failsafeModified(channel); emit modified(); } lock = false; @@ -886,12 +904,12 @@ void ModulePanel::onExtendedLimitsToggled() } } -void ModulePanel::updateFailsafe(int channel) +void ModulePanel::updateFailsafe(unsigned channel) { if (channel >= CPN_MAX_CHNOUT || !failsafeGroupsMap.contains(channel)) return; - const int failsafeValue = module.failsafeChannels[channel]; + const int failsafeValue = model->limitData[channel].failsafe; const ChannelFailsafeWidgetsGroup & grp = failsafeGroupsMap.value(channel); const bool valDisable = (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE); @@ -903,7 +921,7 @@ void ModulePanel::updateFailsafe(int channel) grp.sbUsec->setDisabled(valDisable); if (!valDisable) - setChannelFailsafeValue(channel, failsafeValue, (FAILSAFE_DISPLAY_PERCENT | FAILSAFE_DISPLAY_USEC)); + setChannelFailsafeValue(channel, failsafeValue, FAILSAFE_DISPLAY_PERCENT | FAILSAFE_DISPLAY_USEC); } void ModulePanel::onClearAccessRxClicked() @@ -1166,13 +1184,21 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge ui->trimsDisplay->hide(); } - for (int i=firmware->getCapability(NumFirstUsableModule); igetCapability(NumModules); i++) { + for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) { modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i); ui->modulesLayout->addWidget(modules[i]); connect(modules[i], &ModulePanel::modified, this, &SetupPanel::modified); connect(this, &SetupPanel::extendedLimitsToggled, modules[i], &ModulePanel::onExtendedLimitsToggled); } + for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) { + for (int j = firmware->getCapability(NumFirstUsableModule); j < firmware->getCapability(NumModules); j++) { + if (i != j) { + connect(modules[i], SIGNAL(failsafeModified(unsigned)), modules[j], SLOT(onFailsafeModified(unsigned))); + } + } + } + if (firmware->getCapability(ModelTrainerEnable)) { modules[CPN_MAX_MODULES] = new ModulePanel(this, model, model.moduleData[CPN_MAX_MODULES], generalSettings, firmware, -1); ui->modulesLayout->addWidget(modules[CPN_MAX_MODULES]); diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index fa9e4ad5b..1470e4e2f 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -61,15 +61,17 @@ class ModulePanel : public ModelPanel Q_OBJECT public: - ModulePanel(QWidget *parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx); + ModulePanel(QWidget * parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx); virtual ~ModulePanel(); virtual void update(); public slots: void onExtendedLimitsToggled(); + void onFailsafeModified(unsigned index); signals: void channelsRangeChanged(); + void failsafeModified(unsigned index); private slots: void setupFailsafes(); @@ -95,7 +97,7 @@ class ModulePanel : public ModelPanel void onFailsafeUsecChanged(int value); void onFailsafePercentChanged(double value); void onFailsafesDisplayValueTypeChanged(int type); - void updateFailsafe(int channel); + void updateFailsafe(unsigned channel); void on_optionValue_editingFinished(); void onClearAccessRxClicked(); @@ -114,6 +116,7 @@ class ModulePanel : public ModelPanel Ui::Module *ui; QMap failsafeGroupsMap; static quint8 failsafesValueDisplayType; // FailsafeValueDisplayTypes + void updateFailsafeUI(unsigned channel, quint8 updtSb); }; class SetupPanel : public ModelPanel diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index ac9f6f066..dde8517e0 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -897,9 +897,8 @@ QString ModelPrinter::printFailsafe(int idx) ModuleData module = model.moduleData[idx]; strl << printLabelValue(tr("Failsafe Mode"), printFailsafeMode(module.failsafeMode)); if (module.failsafeMode == FAILSAFE_CUSTOM) { - for (int i=0; isetMaximum(size/2048); + progress->setMaximum(size / 2048); } + if (currStdoutLine.contains("\n")) { int nlPos = currStdoutLine.lastIndexOf("\n"); currStdoutLine = currStdoutLine.mid(nlPos+1); } + if (!currStdoutLine.isEmpty()) { if (currStdoutLine.at(0) == QChar('.')) { int pos = currStdoutLine.lastIndexOf("."); progress->setValue(pos); } else if (currStdoutLine.startsWith("Starting upload: [")) { - int pos = (currStdoutLine.lastIndexOf("#")-19)*100/256; + int pos = (currStdoutLine.lastIndexOf("#") - 19) * 100 / 256; progress->setValue(pos); } } @@ -168,7 +171,15 @@ void FlashProcess::analyseStandardOutput(const QString &text) int end = text.indexOf("%"); if (start > 0) { start += 9; - int value = text.mid(start, end-start).toInt(); + int value = text.mid(start, end - start).toInt(); + progress->setValue(value); + } + } + + if (text.contains("Upload\t[") || text.contains("Download\t[")) { + int end = text.indexOf("%"); + if (end > 0) { + int value = text.mid(end - 3, 3).toInt(); progress->setValue(value); } } @@ -277,7 +288,7 @@ void FlashProcess::errorWizard() DeviceStr = "Atmega 2561"; } } - if (fwexist==false) { + if (!fwexist) { QMessageBox::warning(nullptr, "Companion - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease check advanced burn options to set the correct cpu type.").arg(DeviceStr)); } else { diff --git a/companion/src/process_flash.h b/companion/src/process_flash.h index c39be2644..530938590 100644 --- a/companion/src/process_flash.h +++ b/companion/src/process_flash.h @@ -53,10 +53,10 @@ protected: void analyseStandardError(const QString &text); void errorWizard(); void addReadFuses(); - ProgressWidget *progress; + ProgressWidget * progress; const QString cmd; const QStringList args; - QProcess *process; + QProcess * process; bool hasErrors; QString currStdoutLine; QString currStderrLine; diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index c3214958a..fbc03186f 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -253,7 +253,6 @@ void resetAvrdudeFuses(bool eepromProtect, ProgressWidget * progress) } } - bool readFirmware(const QString & filename, ProgressWidget * progress) { bool result = false; @@ -274,7 +273,7 @@ bool readFirmware(const QString & filename, ProgressWidget * progress) } } - if (result == false) { + if (!result) { qDebug() << "readFirmware: reading" << filename << "with" << getRadioInterfaceCmd() << getReadFirmwareArgs(filename); FlashProcess flashProcess(getRadioInterfaceCmd(), getReadFirmwareArgs(filename), progress); result = flashProcess.run(); diff --git a/companion/src/storage/firmwareinterface.cpp b/companion/src/storage/firmwareinterface.cpp index 369af6504..a07ebbd67 100644 --- a/companion/src/storage/firmwareinterface.cpp +++ b/companion/src/storage/firmwareinterface.cpp @@ -36,7 +36,6 @@ FirmwareInterface::FirmwareInterface(const QString & filename): flash(FSIZE_MAX, 0), flashSize(0), - versionId(0), eepromVersion(0), eepromVariant(0), splashOffset(0), @@ -65,7 +64,7 @@ FirmwareInterface::FirmwareInterface(const QString & filename): // old version format int index = version.lastIndexOf('-'); flavour = version.mid(0, index); - version = version.mid(index+1); + version = version.mid(index + 1); } date = seekLabel(DATE_MARK); time = seekLabel(TIME_MARK); @@ -80,7 +79,6 @@ FirmwareInterface::FirmwareInterface(const QString & filename): eepromVersion = eepromId.toInt(); } - versionId = version2index(version); seekSplash(); isValidFlag = !version.isEmpty(); } diff --git a/companion/src/storage/firmwareinterface.h b/companion/src/storage/firmwareinterface.h index ce9aa994a..d6dee286b 100644 --- a/companion/src/storage/firmwareinterface.h +++ b/companion/src/storage/firmwareinterface.h @@ -39,14 +39,13 @@ class FirmwareInterface { public: - FirmwareInterface(const QString &filename); + FirmwareInterface(const QString & filename); inline QString getDate() { return date; } inline QString getTime() { return time; } int getSize() { return flashSize; } QString getFlavour() const; bool isHardwareCompatible(const FirmwareInterface &previousFirmware) const; inline QString getVersion() { return version; } - unsigned int getVersionId() { return versionId; } inline int getEEpromVersion() { return eepromVersion; } inline int getEEpromVariant() { return eepromVariant; } inline QString getEEpromId() { return eepromId; } @@ -72,7 +71,6 @@ class FirmwareInterface QString time; QString flavour; QString version; - int versionId; QString eepromId; int eepromVersion; int eepromVariant; diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index c8d06c20f..fff65e6d9 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -903,50 +903,65 @@ Manche Droit: Profondeur, Direction - + + Delete Channel. Are you sure? + Supprimer la Voie. Êtes-vous sûr? + + + Copy Copier - + Cut Couper - + Paste Coller - + Clear Effacer - + Insert Insérer - + Delete Supprimer - + Move Up Monter - + Move Down Descendre - + Clear All Effacer Tout + + + Clear Channel. Are you sure? + Effacer la Voie. Êtes-vous sûr? + + + + Clear all Channels. Are you sure? + Effacer toutes les Voies. Êtes-vous sûr? + ChecklistDialog @@ -1361,7 +1376,7 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import CurveData - + CV CB @@ -1501,77 +1516,107 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Nom de la courbe - + Curve %1 Courbe %1 - + Popup menu available Menu contextuel disponible - + %1 points - + Linear Linéaire - + Single Expo Expo simple - + Symmetrical f(x)=-f(-x) Symétrique f(x)=-f(-x) - + Symmetrical f(x)=f(-x) Symétrique f(x)=f(-x) - + Copy Copier - + + Cut + Couper + + + Paste Coller - + Clear Effacer - - Clear all curves - Effacer toutes les courbes + + Insert + Insérer - - Are you sure you want to reset curve %1? - Etes-vous sûr de vouloir effacer la courbe %1 ? + + Delete + Supprimer - - Are you sure you want to reset all curves? - Etes-vous sûr de vouloir effacer toutes les courbes ? + + Move Up + Monter - + + Move Down + Descendre + + + + Clear All + Effacer Tout + + + + Clear Curve. Are you sure? + Effacer la Courbe. Êtes-vous sûr? + + + + Clear all Curves. Are you sure? + Effacer toutes les Courbes. Êtes-vous sûr? + + + + Delete Curve. Are you sure? + Supprimer la Courbe. Êtes-vous sûr? + + + Editing curve %1 Édition de la courbe %1 - + Not enough free points in EEPROM to store the curve. Pas assez de points disponibles en mémoire pour enregistrer la courbe. @@ -1871,70 +1916,85 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import %1 - + + Delete Special Function. Are you sure? + Supprimer la Fonction Spéciale. Êtes-vous sûr? + + + Copy Copier - + Cut Couper - + Paste Coller - + Clear Effacer - + Insert Insérer - + Delete Supprimer - + Move Up Monter - + Move Down Descendre - + Clear All Effacer Tout - + Value Valeur - + Source Source - + GVAR VG - + Increment Incrément + + + Clear Special Function. Are you sure? + Effacer la Fonction Spéciale. Êtes-vous sûr? + + + + Clear all Special Functions. Are you sure? + Supprimer toutes les Fonctions Spéciales. Êtes-vous sûr? + CustomizeSplashDialog @@ -2877,274 +2937,279 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Firmware - + Channel values displayed in us Positions de voies affichées en µs - + No OverrideCH functions available Désactive la fonction spéciale "Remplacer VOIExx" - + Possibility to enable FAI MODE (no telemetry) at field Possibilité d'activer le mode FAI (télémétrie désactivée) sur le terrain - + FAI MODE (no telemetry) always enabled Mode FAI (télémétrie toujours désactivée) - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 Masque le protocole D8. Légalement obligatoire sur les radios Européennes importées après le 1er janvier 2015 - - + + Disable HELI menu and cyclic mix support Supprimer le menu HELICO et les mixages cycliques - - + + Disable Global variables Supprimer le support des variables globales - - + + Enable Lua custom scripts screen Activer l'écran des scripts Lua personnalisés - + Support for PPM internal module hack Support du remplacement du module interne par un module PPM - + Use alternative SQT5 font Utiliser la police alternative SQT5 - - + + Disable RAS (SWR) Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel - + Pots use in menus navigation Support de la navigation dans les menus avec les POTS - + FrSky Taranis X9D+ - + FrSky Taranis X9D+ 2019 - + FrSky Taranis X9D - + Haptic module installed Module vibreur installé - + FrSky Taranis X9E - + Confirmation before radio shutdown Confirmation avant l'arrêt de la radio - + Horus gimbals installed (Hall sensors) Manches Horus à effet HALL installés - + FrSky Taranis X9-Lite - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S - + FrSky Taranis X7 / X7S Access - + FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite - + FrSky Horus X10 / X10S - - + + Support for ACCESS internal module replacement Prise en charge du module de remplacement interne ACCESS - + FrSky Horus X10 Express / X10S Express - + FrSky Horus X12S - + Use ONLY with first DEV pcb version Exclusivement pour les Horus DEV - - + + Support for MULTI internal module Prise en charge du module MULTI interne - - + + Support for bluetooth module Prise en charge du module Bluetooth - + Radiomaster TX16s / TX16s Hall / TX16s Masterfire - + + Support internal GPS + Prise en charge du GPS interne + + + Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support Activer le menu hélico et les mixages CCPM - + Global variables Variables globales - + Enable non certified firmwares Activer les firmwares non certifiés - + In model setup menus automatically set source by moving the control Sélectionner les sources des mixeurs en bougeant le contrôle désiré - + In model setup menus automatically set switch by moving the control Sélectionner les interrupteurs en bougeant le contrôle désiré - + No graphical check boxes and sliders Pas de cases à cocher et de curseurs graphiques - + Battery graph Graphique de la batterie - + Don't use bold font for highlighting active items Ne pas mettre les lignes actives en gras - + Turnigy 9XR with m128 chip Turnigy 9XR avec une puce m128 - + Turnigy 9XR - + 9X with stock board 9X avec carte mère d'origine - + Enable resetting values by pressing up and down at the same time Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite - + 9X with stock board and m128 chip Carte 9x avec un chip m128 - + 9X with AR9X board 9X avec carte AR9X - + Jumper T12 / T12 Pro - + Jumper T16 / T16+ / T16 Pro - + 9X with Sky9x board 9X avec carte Sky9x - + 9X with Gruvin9x board 9X avec carte Gruvin9x - + DIY MEGA2560 radio Radio DIY à base de MEGA2560 @@ -3633,7 +3698,7 @@ Vous utilisez actuellement: FlightModeData - + FM PV @@ -3641,122 +3706,200 @@ Vous utilisez actuellement: FlightModePanel - + Rotary Encoder %1 Sélecteur Rotatif %1 - + Name Nom - + Value source Source valeur - + Value Valeur - + Unit - + Prec - + Min Min - + Max Max - + GVAR%1 VG%1 - + + Warning: Global variable links back to itself. Flight Mode 0 value used. + Avertissement: la Variable Globale boucle sur elle-même. La Phase de Vol 0 est utilisée. + + + + Warning: Rotary encoder links back to itself. Flight Mode 0 value used. + Avertissement: le Sélecteur Rotatif boucle sur lui-même. La Phase de Vol 0 est utilisée. + + + + + Copy + Copier + + + + + Cut + Couper + + + + + Paste + Coller + + + + + Insert + Insérer + + + + + Delete + Supprimer + + + + + Move Up + Monter + + + + + Move Down + Descendre + + + + + Clear All + Effacer Tout + + + + Clear Flight Mode. Are you sure? + Effacer la Phase de Vol. Êtes-vous sûr? + + + + Clear all Flight Modes. Are you sure? + Effacer toutes les Phases de Vol. Êtes-vous sûr? + + + + Delete Flight Mode. Are you sure? + Supprimer la Phase de Vol. Êtes-vous sûr? + + + + Clear selected Global Variable across all Flight Modes. Are you sure? + Effacer les Variables Globales selectionnées à travers toutes les Phases de Vol. Êtes-vous sûr? + + + + Clear all Global Variables for all Flight Modes. Are you sure? + Effacer toutes les Variables Globales pour toutes les Phases de Vol. Êtes-vous sûr? + + + + Clear all Global Variables for this Flight Mode. Are you sure? + Effacer toutes les Variables Globales pour cette Phase de Vol. Êtes-vous sûr? + + + Popup enabled Indication activée - + + Popup menu available Menu contextuel disponible - + Trim disabled Trim désactivé - + Own Trim Valeur indépendante - + Use Trim from Flight mode %1 Utiliser le trim de la phase de vol %1 - + Use Trim from Flight mode %1 + Own Trim as an offset Utiliser le trim de la phase de vol %1 + une valeur indépendante additionnée - + 0._ - + 0.0 - - - &Clear - &Effacer - - - - + + Clear Effacer - - - Clear all current Flight Mode properties? - Effacer tout les modes de vols ? - FlightModesPanel - + Flight Mode %1 Phase de vol %1 - + (%1) - + (default) (par défaut) @@ -5582,25 +5725,27 @@ Cette fonction ne peut pas être désactivée sur la radio. InputsPanel - + + Move Up Monter - + Ctrl+Up Ctrl+Haut - + + Move Down Descendre - + Ctrl+Down Ctrl+Bas @@ -5610,110 +5755,141 @@ Cette fonction ne peut pas être désactivée sur la radio. Effacer toutes les entrées - - Not enough available inputs! - Pas assez d'entrées disponibles ! + + Not enough available Inputs! + Pas assez d'Entrées disponibles! - - Delete Selected Inputs? - Supprimer les entrées sélectionnées ? + + Delete selected Inputs. Are you sure? + Supprimer les Entrées selectionnés. Êtes-vous sûr? - + + Lines + Linéaire + + + &Add &Ajouter - + Ctrl+A Ctrl+A - + &Edit &Édition - + Enter Entrée - + &Delete &Supprimer - + + Delete Supprimer - + &Copy &Copier - + Ctrl+C - + &Cut &Couper - + Ctrl+X - + &Paste &Coller - + Ctrl+V - + Du&plicate Du&pliquer - + Ctrl+U - - Clear Inputs? - Effacer toutes les entrées ? + + Input + Entrée - - Really clear all the inputs? - Voulez-vous vraiment effacer toutes les entrées ? + + Insert + Insérer + + + + Clear + Effacer + + + + Clear All + Effacer Tout + + + + Clear all Inputs. Are you sure? + Effacer toutes les Entrées. Êtes-vous sûr? + + + + Clear Input. Are you sure? + Effacer l'Entrée. Êtes-vous sûr? + + + + Delete Input. Are you sure? + Supprimer l'Entrée. Êtes-vous sûr? LimitData - + INV - + NOR - + CH VOIE @@ -5852,69 +6028,104 @@ Cette fonction ne peut pas être désactivée sur la radio. LogicalSwitchesPanel - + V1 - + V2 - + Duration Durée - + Delay Délai - + Function Fonction - + AND Switch ET supplémentaire - + Popup menu available Menu contextuel disponible - + (instant) - + (infinite) (infini) - - &Delete - &Supprimer - - - - &Copy - &Copier - - - - &Cut - &Couper + + Delete Logical Switch. Are you sure? + Supprimer l'Interrupteur Logique. Êtes-vous sûr? - &Paste - &Coller + Copy + Copier + + + + Cut + Couper + + + + Paste + Coller + + + + Clear + Effacer + + + + Insert + Insérer + + + + Delete + Supprimer + + + + Move Up + Monter + + + + Move Down + Descendre + + + + Clear All + Effacer Tout + + + + Clear all Logical Switches. Are you sure? + Effacer tous les Interrupteurs Logiques. Êtes-vous sûr? @@ -7457,12 +7668,12 @@ Enregistrer les changements ? MixData - + MIX - + (@%1) @@ -7857,12 +8068,12 @@ Mixage actif par défaut si non-renseigné. ModelData - + Model: Modèle: - + Throttle Source Source des gaz @@ -8998,12 +9209,12 @@ Mixage actif par défaut si non-renseigné. ModuleData - + Positive - + Negative Négative @@ -9084,47 +9295,47 @@ Mixage actif par défaut si non-renseigné. ModulePanel - + Value Valeur - + Hold Maintien - + No Pulse Pas d'impulsion - + Ask Demander - + Internal Interne - + Internal + External Interne + Externe - + External Externe - + Autodetect Format Format Détection auto - + Bind on channel Bind avec VOIE @@ -11075,25 +11286,90 @@ Si cette option est cochée, la voie des gaz est inversée: le ralenti est &apo SetupPanel - + + Popup menu available + Menu contextuel disponible + + + Timer %1 Chrono %1 - + THR GAZ - + Profile Settings Paramètres du profil - + SD structure path not specified or invalid Chemin de la structure SD non spécifié ou invalide + + + Copy + Copier + + + + Cut + Couper + + + + Paste + Coller + + + + Clear + Effacer + + + + Insert + Insérer + + + + Delete + Supprimer + + + + Move Up + Monter + + + + Move Down + Descendre + + + + Clear All + Effacer Tout + + + + Clear Timer. Are you sure? + Effacer le Chrono. Êtes-vous sûr? + + + + Clear all Timers. Are you sure? + Effacer tous les Chronos. Êtes-vous sûr? + + + + Delete Timer. Are you sure? + Supprimer le Chrono. Êtes-vous sûr? + SimpleTailPage @@ -13410,12 +13686,12 @@ hh:mm:ss TimerData - + TMR - + Timer %1 Chrono %1 diff --git a/companion/src/translations/companion_ja.ts b/companion/src/translations/companion_ja.ts index ddc8b2c37..da32c47fc 100644 --- a/companion/src/translations/companion_ja.ts +++ b/companion/src/translations/companion_ja.ts @@ -108,94 +108,94 @@ 送信機プロファイル - - - - - - + + + + + + Select Folder フォルダの選択 - - + + The profile specific folder, if set, will override general Backup folder プロファイル保存フォルダが指定される場合は、バックアップフォルダを上書き保存します - + Splash Screen 起動イメージ - + Select Image イメージの選択 - + Clear Image イメージの消去 - + Profile Name プロファイル名 - + Radio Type 送信機タイプ - + Menu Language メニュー言語 - + Build Options ビルドオプション - + SD Structure path SDカード保存先パス - + Backup folder バックアップフォルダ - + If set it will override the application general setting 設定されている場合はアプリケーション設定を上書き保存します - + if set, will override general backup enable 設定されている場合は有効なバックアップを上書き保存します - - + + Enable automatic backup before writing firmware 設定した場合は自動バックアップを有効にします - + General Settings 一般設定 - + Default Stick Mode 初期スティックモード - + Mode selection: Mode 1: @@ -218,464 +218,479 @@ Mode 4: - + Mode 1 (RUD ELE THR AIL) モード1 (左:エレベーター・ラダー 右:スロットル・エルロン) - + Mode 2 (RUD THR ELE AIL) モード2 (左:スロットル・ラダー 右:エレベーター・エルロン) - + Mode 3 (AIL ELE THR RUD) モード3 (左:エレベーター・エルロン 右:スロットル・ラダー) - + Mode 4 (AIL THR ELE RUD) モード4 (左:スロットル・エルロン 右:エレベーター・ラダー) - + Default Channel Order 初期チャンネルマップ - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> <html><head/><body><p>チャンネルマップ</p><p><br/></p><p>モデル作成された際の初期チャンネルマップを定義します</p></body></html> - + R E T A ↔RUD ↕ELE ↕THR ↔AIL [R E T A] - + R E A T ↔RUD ↕ELE ↔AIL ↕THR [R E A T] - + R T E A ↔RUD ↕THR ↕ELE ↔AIL [R T E A] - + R T A E ↔RUD ↕THR ↔AIL ↕ELE [R T A E] - + R A E T ↔RUD ↔AIL ↕ELE ↕THR [R A E T] - + R A T E ↔RUD ↔AIL ↕THR ↕ELE [R A T E] - + E R T A ↕ELE ↔RUD ↕THR ↔AIL [E R T A] - + E R A T ↕ELE ↔RUD ↔AIL ↕THR [E R A T] - + E T R A ↕ELE ↕THR ↔RUD ↔AIL [E T R A] - + E T A R ↕ELE ↕THR ↔AIL ↔RUD [E T A R] - + E A R T ↕ELE ↔AIL ↔RUD ↕THR [E A R T] - + E A T R ↕ELE ↔AIL ↕THR ↔RUD [E A T R] - + T R E A ↕THR ↔RUD ↕ELE ↔AIL [T R E A] - + T R A E ↕THR ↔RUD ↔AIL ↕ELE [T R A E] - + T E R A ↕THR ↕ELE ↔RUD ↔AIL [T E R A] - + T E A R ↕THR ↕ELE ↔AIL ↔RUD [T E A R] - + T A R E ↕THR ↔AIL ↔RUD ↕ELE [T A R E] - + T A E R ↕THR ↔AIL ↕ELE ↔RUD [T A E R] - + A R E T ↔AIL ↔RUD ↕ELE ↕THR [A R E T] - + A R T E ↔AIL ↔RUD ↕THR ↕ELE [A R T E] - + A E R T ↔AIL ↕ELE ↔RUD ↕THR [A E R T] - + A E T R ↔AIL ↕ELE ↕THR ↔RUD [A E T R] - + A T R E ↔AIL ↕THR ↔RUD ↕ELE [A T R E] - + A T E R ↔AIL ↕THR ↕ELE ↔RUD [A T E R] - + Append version number to FW file name ファームウェア ファイル名にバージョン番号を追加 - + + Simulator controls + シミュレータ コントロール + + + + Save switch/pot positions on simulator exit + シミュレータ終了時にスイッチ/ポットのポジションを保存 + + + + Clear saved positions + 保存したポジションを消去 + + + Offer to write FW to Tx after download ダウンロード後、送信機にFWを適用可能な事を通知 - + Other Settings その他の設定 - + Application Settings アプリケーション設定 - + Automatic check for OpenTX firmware updates OpenTXファームアップデートの自動チェック - + Automatic check for Companion updates Companionアップデートの自動チェック - + most recently used files 最近使用したファイル - + Startup Settings スタートアップ設定 - + Google Earth Executable Google Earthの実行 - + Automatic Backup Folder 自動バックアップフォルダ - + Remember ファイル履歴 - - Show splash screen when Companion starts - Companion起動時に起動イメージを表示 - - - + Output Logs Folder ログ出力フォルダ - + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> <html><head/><body><p>このオプションは、機体モデルが削除または移動した際、そのモデルスロットが保持される旧版のOpenTxバージョンの挙動を維持します。</p><p>このオプションが選択されない場合は、他の機体モデルは削除により残された差異を埋めるために並べ替えるかもしれません。</p></body></html> - + Remove empty model slots when deleting models (only applies for radios w/out categories) モデルを削除するとき同時に空モデルスロットを削除 (カテゴリなしの機体モデルにのみ適用) - + Use model wizard 機体モデルウィザードを使用 - + Open model editor 機体モデルエディタを開く - + Just create the model 機体モデルの作成のみ - + Debug Output Logging 出力したログのデバッグ - + Only show user splash images オリジナルの起動イメージのみを表示 - + Show user and companion splash images オリジナルとCompanion標準イメージを表示 - + + Show splash screen + 起動イメージを表示 + + + Select Executable 実行ファイル選択 - + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> <html><head/><body><p>デスクトップのCompanion / シミュレータ アプリケーションにより生成された、すべてのデバッグメッセージのログを保存します。OpenTX開発者は問題を診断・解析するため、ログを要求するかもしれません。</p></body></html> - + Application (Companion/Simulator) アプリケーション (Companion / シミュレータ) - + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> <html><head/><body><p>シミュレータで実行しているときは、送信機ファームウェアによって生成されたすべてのメッセージのログを保存してください。これはシミュレータの<span style = "font-style:italic;">デバッグ出力</span>ウィンドウにも同じ情報が表示されます。</p></body></html> - + Radio Firmware (in Simulator) 送信機ファームウェア (シミュレータ内) - + Splash Screen Library 起動イメージライブラリ - + User Splash Screens オリジナル起動イメージ - + Action on New Model 機体モデル新規作成 - + Release channel リリース状態 選択 - + Releases (stable) リリース版 (Stable) - + Release candidates (testing) Release candidates RC版 (Testing) - + Nightly builds (unstable) ナイトリービルド版 (Unstable) - + + Prompt for radio profile + 送信機プロファイルの呼び出し + + + Simulator Settings シミュレータ設定 - + Calibrate キャリブレート - + Blue 青色 - + Green 緑色 - + Red 赤色 - + Orange オレンジ - + Yellow 黄色 - + Screenshot capture folder 画面キャプチャフォルダ - + Only capture to clipboard キャプチャをクリップボードのみにコピー - + Enable 有効 - + Joystick スティック - + Simulator BackLight バックライト - - Remember simulator switch values - シミュレータで設定した各スイッチの値を記憶 - - - + Simulator Volume Gain シミュレータ 音量幅 - + My Radio マイ送信機 - + <p><b>You cannot switch Radio Type or change Build Options while there are unsaved file changes. What do you wish to do?</b></p> <ul><li><i>Save All</i> - Save any open file(s) before saving Settings.<li><li><i>Reset</i> - Revert to the previous Radio Type and Build Options before saving Settings.</li><li><i>Cancel</i> - Return to the Settings editor dialog.</li></ul> <p><b>ファイル変更後で保存されていない間は、送信機タイプの切り替えやビルドオプションの変更はできません。保存しますか?</b></p> <ul><li><i>すべて保存</i> - 設定を保存する前に、開いているファイルをすべて保存します  <li><li><i>リセット</i> - 設定を保存する前に、以前の送信機タイプとビルドオプションに戻します </li><li><i>キャンセル</i> - 設定エディタダイアログに戻ります </li></ul> - + Select your snapshot folder 画面キャプチャフォルダ選択してください - + Note: Nightly builds are not available in this version, Release/RC update channel will be used. 注: このバージョンではナイトリービルドは使用できません。リリース/RC版のアップデートチャネルが使用されます。 - - + + No joysticks found スティックが認識できません - + EMPTY: No radio settings stored in profile 空: プロファイルに送信機設定が保存されていません - + AVAILABLE: Radio settings of unknown age 利用可能: 詳細不明の送信機設定 - + AVAILABLE: Radio settings stored %1 利用可能: 送信機設定は %1 に保存されています - + Select your library folder ライブラリフォルダを選択してください - - + + Select your Models and Settings backup folder 機体モデルの選択とバックアップフォルダの設定をしてください - + Select a folder for application logs アプリケーションログフォルダを選択してください - + Select Google Earth executable Google Earth実行有無を選択してください - + Select the folder replicating your SD structure SDカード保存先フォルダを選択してください - + Open Image to load イメージを開いてロードします - + Images (%1) イメージ (%1) @@ -715,58 +730,58 @@ Mode 4: Boards - + Left Horizontal 左・横 - + Left Vertical 左・縦 - + Right Vertical 右・縦 - + Right Horizontal 右・横 - + Aux. 1 AUX. 1 - + Aux. 2 AUX. 2 - - + + Unknown 不明 - + Rud ラダー - + Ele エレベーター - + Thr スロットル - + Ail エルロン @@ -815,84 +830,124 @@ Mode 4: Channels - + Name 名称 - + Subtrim サブトリム - + Min 最小 - + Max 最大 - + Direction 方向 - + Curve カーブ - + PPM Center PPM センター - + Linear Subtrim 線形サブトリム - + CH%1 CH%1 - + Popup menu available 利用可能なポップアップメニュー - + --- --- - + INV リバース - - &Copy - &コピー - - - - &Cut - &切り取り + + Delete Channel. Are you sure? + チャンネルを削除します。よろしいですか? - &Paste - &貼り付け + Copy + コピー - &Delete - &削除 + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Channel. Are you sure? + チャンネルを消去します。よろしいですか? + + + + Clear all Channels. Are you sure? + チャンネルをすべて消去します。よろしいですか? @@ -1310,7 +1365,7 @@ If you have a settings backup file, you may import that instead. CurveData - + CV CV @@ -1450,79 +1505,109 @@ If you have a settings backup file, you may import that instead. 点のサイズ - + Curve %1 カーブ %1 - + Popup menu available 利用可能なポップアップメニュー - + %1 points %1 点 - + Linear 線形 - + Single Expo シングルエクスポ - + Symmetrical f(x)=-f(-x) 対称 f(x)=-f(-x) - + Symmetrical f(x)=f(-x) 対称 f(x)=f(-x) - + Editing curve %1 カーブ %1 編集 - + Not enough free points in EEPROM to store the curve. EEPROMにカーブを保存する十分な空き容量がありません。 - + Copy コピー - + + Cut + 切り取り + + + Paste 貼り付け - + Clear 消去 - - Clear all curves - すべてのカーブ消去 + + Insert + 挿入 - - Are you sure you want to reset curve %1? - カーブ %1をリセットしてもよいですか? + + Delete + 削除 - - Are you sure you want to reset all curves? - すべてのカーブをリセットしてもよいですか? + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Curve. Are you sure? + カーブを消去します。よろしいですか? + + + + Clear all Curves. Are you sure? + カーブをすべて消去します。よろしいですか? + + + + Delete Curve. Are you sure? + カーブを削除します。よろしいですか? @@ -1569,193 +1654,198 @@ If you have a settings backup file, you may import that instead. + Trainer Channels + トレーナー チャンネル + + + Instant Trim トリム - + Play Sound サウンド 再生 - + Haptic タッチパネル - + Reset リセット - + Set Timer %1 設定: タイマー %1 - + Vario バリオ - + Play Track トラック 再生 - + Play Both 両方 実行 - + Play Value 値 実行 - + Play Script スクリプト 実行 - + SD Logs SDログ - + Volume 音量 - + Backlight バックライト - + Screenshot 画面キャプチャ - + Background Music BGM - + Background Music Pause BGM一時停止 - + Adjust %1 アジャスト %1 - + SetFailsafe Int. Module 設定: フェイルセーフ 内部モジュール - + SetFailsafe Ext. Module 設定: フェイルセーフ 外部モジュール - + RangeCheck Int. Module レンジチェック 内部モジュール - + RangeCheck Ext. Module レンジチェック 外部モジュール - + Bind Int. Module バインド 内部モジュール - + Bind Ext. Module バインド 外部モジュール - + Timer1 タイマー1 - + Timer2 タイマー2 - + Timer3 タイマー3 - + Flight フライト - + Telemetry テレメトリー - + Rotary Encoder エンコーダ再生 - + REa エンコーダ再生a - + REb エンコーダ再生b - + s s - - - + + + <font color=red><b>Inconsistent parameter</b></font> <font color=red><b>矛盾しているパラメータ</b></font> - + Value 値 - + played once, not during startup 起動時以外 1回実行 - + repeat(%1s) リピート(%1s) - + DISABLED 無効 - + CFN CFN @@ -1815,42 +1905,82 @@ If you have a settings backup file, you may import that instead. %1 - - &Copy - &コピー + + Delete Special Function. Are you sure? + スペシャルファンクションを削除します。よろしいですか? - - &Cut - &切り取り + + Copy + コピー - - &Paste - &貼り付け + + Cut + 切り取り - - &Delete - &削除 + + Paste + 貼り付け - + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Special Function. Are you sure? + スペシャルファンクションを消去します。よろしいですか? + + + + Clear all Special Functions. Are you sure? + スペシャルファンクションをすべて消去します。よろしいですか? + + + Value 値 - + Source 選択元 - + GVAR GVAR - + Increment 増加 @@ -2043,23 +2173,23 @@ If you have a settings backup file, you may import that instead. このボードでは選択元 %1 をエクスポートできません! - + OpenTX only accepts %1 points in all curves OpenTXはすべてのカーブで %1 点のみを許容します - + OpenTx only accepts %1 points in all curves OpenTxはすべてのカーブで %1 点のみを許容します - - + + OpenTX on this board doesn't accept this function このボード上のOpenTXはこの機能を受け付けません - + OpenTX doesn't accept this radio protocol OpenTXはこの送信機プロトコルを受け付けません @@ -2139,12 +2269,12 @@ To <b>remove a remembered entry</b> from the filter list, first cho フィルタをON / OFFします。 - + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html> <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>フィルタは2つのシンタックスタイプをサポートしています: 一般的なワイルドカードを用いた完全一致、そして完全なPerlスタイル (<code>pcre</code>) 正規表現です。初期値ではフィルタは一致する (<b>包括的</b>) な行のみを表示します。一致する行を削除する<b>排他的</b>フィルタを作成するには、フィルタ式の先頭に<kbd>!</kbd>(Exclamationマーク)を付けます。</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <b>正規表現</b> (RegEx)を使用するには、フィルタテキストの先頭に<kbd>/</kbd> (スラッシュ) または<kbd>^</kbd>(アップキャレット)を付けます。<ul><li>既に <kbd>/</kbd> または <kbd>^</kbd> を使用している場合は、 <kbd>!</kbd> の後ろに置きます。</li><li>初期値では大文字と小文字が区別されます。それを鈍感にするには、正規表現の最後に典型的な <kbd>/i</kbd> (スラッシュ+i)演算子を追加します。</li> <li> 正規表現を表すためにキャレット『^』を使用すると、それは正規表現の一部になります。例(つまり、行頭から一致します。)</li> <li> 正規表現が無効な場合、フィルタ編集フィールドには赤い枠が表示されフィルタを有効にすることはできません。</li> <li> 正規表現のテストに役立つリソース(参考文献)は、<a href="http://www.regexr.com/"> http://www.regexr.com/にあります。</a></li> </ul></p><p><b>標準一致 basic matching</b> を使用するには、テキストを入力するだけです。<ul><li>ワイルドカード: <kbd>*</kbd> (アスタリスク)は0個以上の任意の文字に一致し、 <kbd>?</kbd> (クエスチョンマーク) は任意の1文字に一致します。</li><li>この一致では常に大文字と小文字が区別されません。</li><li>一致は常にログの先頭行から始まります。 先頭の文字を無視するには、先頭に<kbd>*</kbd>ワイルドカードを使用します。</li><li>末尾の <kbd>*</kbd> は常に暗黙的に指定されます。(つまり、ログ末尾行までが対象) これを回避するには、正規表現を使用します。</li><li>リテラルワイルドカード文字の前に <kbd>\</kbd> (バックスラッシュ) 文字を付けることで一致させることができます。(例: "foo\*bar"は"foo*bar"と一致)</li></ul></p><p><b>テキスト編集</b>後、EnterまたはTabキーを押して (またはボックスの外側をクリックし) フィルタを更新します。</p><p>フィルタセレクタリストから<b>エントリー削除</b>をするには、まずエントリーを選択しエディタで<kbd>Shift+Delete</kbd> (または<kbd>Shift+Backspace</kbd>) を押します。デフォルトのフィルタは削除できません。また最大50個のフィルタが保存されています。</p></body></html> - + Debug Console Filter Help デバッグコンソールフィルタ ヘルプ @@ -2795,275 +2925,279 @@ Blank means include all. ?, *, and [...] wildcards accepted. Firmware - + Channel values displayed in us 表示されるチャンネル値 - + No OverrideCH functions available 使用可能な上書きチャンネル機能はありません - + Possibility to enable FAI MODE (no telemetry) at field フィールドでFAIモード (テレメトリーなし) を有効にする可能性 - + FAI MODE (no telemetry) always enabled FAIモード (テレメトリーなし) を常に有効 - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 2015/01/01以降に販売された送信機に対し、EUでの使用に適さないD8 FrSkyプロトコルサポートを削除 - + Enable non certified firmwares 認定されていないファームウェアを有効にする - - + + Disable HELI menu and cyclic mix support HELIメニューとサイクリックミックスサポートを無効にする - - + + Disable Global variables グローバル変数を無効にする - - + + Enable Lua custom scripts screen Luaカスタムスクリプト画面を有効にする - + Use alternative SQT5 font SQT5 代替フォントを使用する - + Pots use in menus navigation メニューナビゲーションでダイヤルを使用 - + FrSky Taranis X9D+ FrSky Taranis X9D+ - + Support for PPM internal module hack PPM内部モジュールハックのサポート - + + Disable RAS (SWR) RAS (SWR)を無効にする - + FrSky Taranis X9D+ 2019 - + FrSky Taranis X9D FrSky Taranis X9D - + Haptic module installed タッチパネル対応モジュールをインストール - + FrSky Taranis X9E FrSky Taranis X9E - + Confirmation before radio shutdown 送信機シャットダウン前の確認 - + Horus gimbals installed (Hall sensors) Horusジンバル (ホールセンサー) をインストール - + FrSky Taranis X9-Lite FrSky Taranis X9-Lite - - - - - - Support for auto update on boot - 起動時の自動更新サポート - - - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S FrSky Taranis X7 / X7S - + FrSky Taranis X-Lite S/PRO FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite FrSky Taranis X-Lite - + FrSky Horus X10 / X10S FrSky Horus X10 / X10S - - FrSky Horus X10 / X10S Express - - - - + FrSky Horus X12S FrSky Horus X12S - + Use ONLY with first DEV pcb version 初期DEV pcbバージョンでのみ使用 - - Jumper T16 / T16+ - - - - + + Support for MULTI internal module MULTI内部モジュールのサポート - + + Support for bluetooth module Bluetoothモジュールのサポート - + Turnigy 9XR-PRO Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support HELIメニューとサイクリックミックスのサポートを有効にする - + Global variables グローバル変数 - + In model setup menus automatically set source by moving the control モデル設定メニューでは、コントローラーを動かし自動的に選択元を設定します - + In model setup menus automatically set switch by moving the control モデル設定メニューでは、コントローラーを動かし自動的にスイッチを設定します - + No graphical check boxes and sliders グラフィカルなチェックボックスとスライダーはありません - + Battery graph バッテリーグラフ - + Don't use bold font for highlighting active items 有効なアイテムを強調表示するために太字フォントを使用しない - - + + FrSky Taranis X7 / X7S Access + FrSky Taranis X7 / X7S ACCESS + + + + Support for ACCESS internal module replacement ACCESS内部モジュール変更のサポート - - Jumper T12 - - - - - Enable non certified R9M firmwares - 非認定 R9Mファームウェアを有効 - - - + Turnigy 9XR with m128 chip Turnigy 9XR m128チップ搭載 - + Turnigy 9XR Turnigy 9XR - + 9X with stock board 9X ストックボード - + Enable resetting values by pressing up and down at the same time 上下に同時に押し、値のリセットを有効にする - + 9X with stock board and m128 chip 9X ストックボード+m128 chip - + 9X with AR9X board 9X AR9Xボード - + + FrSky Horus X10 Express / X10S Express + FrSky Horus X10 Express / X10S Express + + + + Jumper T12 / T12 Pro + Jumper T12 / T12 Pro + + + + Jumper T16 / T16+ / T16 Pro + Jumper T16 / T16+ / T16 Pro + + + + Radiomaster TX16s / TX16s Hall / TX16s Masterfire + Radiomaster TX16s / TX16s Hall / TX16s Masterfire + + + + Support internal GPS + 内蔵GPSサポート + + + 9X with Sky9x board 9X Sky9Xボード - + 9X with Gruvin9x board 9X Gruvin9X - + DIY MEGA2560 radio DIY MEGA2560 送信機 @@ -3538,11 +3672,21 @@ You are currently using: Switch スイッチ + + + trim6 + トリム6 + + + + trim5 + トリム5 + FlightModeData - + FM FM @@ -3550,122 +3694,200 @@ You are currently using: FlightModePanel - + + Popup menu available 利用可能なポップアップメニュー - + Trim disabled トリム 無効 - + Own Trim 独自トリム - + Use Trim from Flight mode %1 フライトモードからトリムを使用してください %1 - + Use Trim from Flight mode %1 + Own Trim as an offset フライトモードからトリムを使用してください %1+オフセット独自トリム - + Rotary Encoder %1 ロータリーエンコーダ %1 - + Name 名称 - + Value source 元値 - + Value 値 - + Unit ユニット - + Prec - + Min 最小 - + Max 最大 - + Popup enabled ポップアップ有効 - + GVAR%1 - + 0._ - + 0.0 0.0 - - - &Clear - &消去 + + Warning: Global variable links back to itself. Flight Mode 0 value used. + 警告: フライトモード0の値を使用するとグローバル変数としてリンクされます。 - - + + Warning: Rotary encoder links back to itself. Flight Mode 0 value used. + 警告: フライトモード0の値を使用するとロータリーエンコーダとしてリンクされます。 + + + + + Copy + コピー + + + + + Cut + 切り取り + + + + + Paste + 貼り付け + + + + + Insert + 挿入 + + + + + Delete + 削除 + + + + + Move Up + 上へ移動 + + + + + Move Down + 下へ移動 + + + + + Clear All + すべて消去 + + + + Clear Flight Mode. Are you sure? + フライトモードを消去します。よろしいですか? + + + + Clear all Flight Modes. Are you sure? + フライトモードをすべて消去します。よろしいですか? + + + + Delete Flight Mode. Are you sure? + フライトモードを削除します。よろしいですか? + + + + Clear selected Global Variable across all Flight Modes. Are you sure? + すべてのフライトモードの選択したグローバル変数を消去します。よろしいですか? + + + + Clear all Global Variables for all Flight Modes. Are you sure? + すべてのフライトモードのすべてのグローバル変数を消去します。よろしいですか? + + + + Clear all Global Variables for this Flight Mode. Are you sure? + このフライトモードのすべてのグローバル変数を消去します。よろしいですか? + + + + Clear 消去 - - - Clear all current Flight Mode properties? - 現在のフライトモードのプロパティをすべて消去しますか? - FlightModesPanel - + Flight Mode %1 フライトモード %1 - + (%1) (%1) - + (default) (初期値) @@ -3993,7 +4215,7 @@ These will be relevant for all models in the same EEPROM. GeneralSettings - + Radio Settings 送信機設定 @@ -4462,6 +4684,11 @@ p, li { white-space: pre-wrap; } Show splash screen on startup 起動時、起動イメージ表示 + + + nnnnnnNN + nnnnnnNN + Power On Delay @@ -4648,11 +4875,6 @@ Acceptable values are 5v..10v Owner Registration ID オーナー登録ID - - - aaaaaaAA - - R E T A @@ -5283,8 +5505,8 @@ Are you sure ? HardwarePanel - - + + None なし @@ -5304,67 +5526,67 @@ Are you sure ? 3 ポジション - + Pot with detent ダイヤル (ノッチあり) - + Multipos switch マルチPosスイッチ - + Pot without detent ダイヤル (ノッチなし) - + Slider with detent スライダー (ノッチあり) - + OFF OFF - + Enabled 有効 - + Telemetry テレメトリー - + Trainer トレーナー - + Internal 内部 - + Ask 確認 - + Per model Per モデル - + Internal + External 内部 + 外部 - + External 外部 @@ -5491,138 +5713,171 @@ Are you sure ? InputsPanel - + + Move Up 上へ移動 - + Ctrl+Up - + + Move Down 下へ移動 - + Ctrl+Down Clear All Inputs - すべての入力を消去 + すべての入力項目を消去 - - Not enough available inputs! - 入力項目が足りません! + + Not enough available Inputs! + 入力項目が不足しています! - - Delete Selected Inputs? - 選択した入力を削除しますか? + + Delete selected Inputs. Are you sure? + 選択した入力項目を削除します。よろしいですか? - + + Lines + 直線 + + + &Add &追加 - + Ctrl+A - + &Edit &編集 - + Enter Enter - + &Delete &削除 - + + Delete 削除 - + &Copy &コピー - + Ctrl+C - + &Cut &切り取り - + Ctrl+X - + &Paste &貼り付け - + Ctrl+V - + Du&plicate &複製 - + Ctrl+U - - Clear Inputs? - 入力を消去しますか? + + Input + 入力 - - Really clear all the inputs? - すべての入力を本当に消去しますか? + + Insert + 挿入 + + + + Clear + 消去 + + + + Clear All + すべて消去 + + + + Clear all Inputs. Are you sure? + すべての入力項目を消去します。よろしいですか? + + + + Clear Input. Are you sure? + 入力項目を消去します。よろしいですか? + + + + Delete Input. Are you sure? + 入力項目を削除します。よろしいですか? LimitData - + INV リバース - + NOR ノーマル - + CH CH @@ -5761,69 +6016,104 @@ Are you sure ? LogicalSwitchesPanel - + Function 機能 - + V1 - + V2 - + AND Switch & スイッチ - + Duration 期間 - + Delay 遅延 - + Popup menu available 利用可能なポップアップメニュー - + (instant) (瞬間) - + (infinite) (無制限) - - &Copy - &コピー - - - - &Cut - &切り取り + + Delete Logical Switch. Are you sure? + 論理スイッチを削除します。よろしいですか? - &Paste - &貼り付け + Copy + コピー - &Delete - &削除 + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear all Logical Switches. Are you sure? + 論理スイッチをすべて消去します。よろしいですか? @@ -5971,8 +6261,8 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt - total duration - 合計期間 + time span + 期間 @@ -6003,123 +6293,123 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt MainWindow - + Diskimage (*.dmg) ディスクイメージ (*.dmg) - + Would you like to open the disk image to install the new version? 新しいバージョンをインストールするためにディスクイメージを開きますか? - + Executable (*.exe) 実行ファイル (*.exe) - - + + Would you like to launch the installer? インストーラを起動しますか? - - + + File loaded ファイルがロードされました - + Checking for updates アップデートの確認 - + A new version of Companion is available (version %1)<br>Would you like to download it? Companionの新しいバージョンがあります。 (version %1)<br>ダウンロードしますか? - - + + Save As 名前を付けて保存 - + New release available 新リリースが利用可能 - + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> Companionの新リリースが利用可能です。<a href='%1'>OpenTX Webサイト</a>をチェックしてください - - + + No updates available at this time. 現時点で利用可能なアップデートはありません。 - + Error opening file %1: %2. ファイル %1 を開くときにエラーが発生しました: %2. - + Not enough flash available on this board for all the selected options 選択されたすべてのオプションに対してこのボードでは十分な書き込みが行えません - + Compilation server temporary failure, try later コンパイルサーバが一時的に失敗しました。後程お試しください - + Compilation server too busy, try later コンパイルサーバがビジー状態です。後程お試しください - + Compilation error コンパイルエラー - + Invalid firmware 無効なファームウェア - + Invalid board 無効なボード - + Invalid language 無効な言語 - + Unknown server failure, try later 不明なサーバの障害です。後程お試しください - + Do you want to write the firmware to the radio now ? 今すぐファームウェアを送信機に書き込みますか? - + Firmware update check failed, new version information not found or invalid. ファームウェアアップデートの確認に失敗しました。新しいバージョン情報が見つからないか、または無効です。 - + Firmware %1 does not seem to have ever been downloaded. Version %2 is available. Do you want to download it now? @@ -6132,31 +6422,31 @@ We recommend you view the release notes using the button below to learn about an 重要な変更については、下のボタンをクリックしてリリースノートを参照することをお勧めします。 - - + + Yes はい - - + + No いいえ - - + + Release Notes リリースノート - - + + Do you want to download version %1 now ? 今すぐバージョン %1 をダウンロードしますか? - + A new version of %1 firmware is available: - current is %2 - newer is %3 @@ -6173,29 +6463,29 @@ We recommend you view the release notes using the button below to learn about an 重要な変更については、下のボタンをクリックしてリリースノートを参照することをお勧めします。 - + Ignore this version %1? このバージョン %1 を無視しますか? - + The new theme will be loaded the next time you start Companion. 次回Companionを起動したときに、新しいテーマがロードされます。 - - + + Open Models and Settings file 機体モデルと設定ファイルを開く - + File saved ファイル 保存 - + There are unsaved file changes which you may lose when switching radio types. Do you wish to continue? @@ -6204,780 +6494,780 @@ Do you wish to continue? そのまま続けますか? - - + + Synchronize SD SDカードを同期する - + No local SD structure path configured! SDカード保存先パスが設定されていません! - + No Companion release candidates are currently being served for this version, please switch release channel 現在このバージョンのCompanion RC版は提供されていません。リリース状態を切り替えてください - + No nightly Companion builds are currently being served for this version, please switch release channel 現在、このバージョンのCompanion ナイトリービルド版は提供されていません。リリース状態を切り替えてください - + No Companion release builds are currently being served for this version, please switch release channel このバージョンのCompanion リリース版は現在提供されていません。リリース状態を切り替えてください - + Companion update check failed, new version information not found. Companionアップデートの確認に失敗しました。新しいバージョン情報が見つかりません。 - + No firmware release candidates are currently being served for this version, please switch release channel 現在、このバージョンのファームウェア RC版は提供されていません。リリース状態を切り替えてください - + No firmware nightly builds are currently being served for this version, please switch release channel 現在、このバージョンのファームウェア ナイトリービルド版は提供されていません。リリース状態を切り替えてください - + No firmware release builds are currently being served for this version, please switch release channel 現在、このバージョンのファームウェア リリース版は提供されていません。リリース状態を切り替えてください - + Release candidate builds are now available for this version, would you like to switch to using them? RC版はこのバージョンで利用可能になりました。それらに切り替えますか? - + Channel changed to RC, please restart the download process リリース状態をRC版に変更しました。ダウンロードプロセスを再起動してください - + Official release builds are now available for this version, would you like to switch to using them? このバージョンの公式リリース版が利用可能になりました。それらに切り替えますか? - + Channel changed to Release, please restart the download process リリース状態をリリース版に変更しました。ダウンロードプロセスを再起動してください - + This radio (%1) is not currently available in this firmware release channel この送信機 (%1) は、現在このファームウェアリリース状態では利用できません - + No Radio or SD card detected! 送信機またはSDカードが検出されませんでした! - + Local Folder ローカルフォルダ - + Radio Folder 送信機フォルダ - - + + Read Firmware from Radio 送信機からファームウェアを読み込み - - + + Read Models and Settings from Radio 送信機から機体モデルや設定を読み込み - + Models and Settings read 機体モデルと設定の読み込み - - + + This function is not yet implemented この機能はまだ実装されていません - + Save Radio Backup to File 送信機のバックアップをファイルに保存 - + Read Radio Firmware to File 送信機ファームウェアからファイルへの読み込み - + OpenTX Home Page: <a href='%1'>%1</a> OpenTX ホームページ: <a href='%1'>%1</a> - + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> OpenTX Companionプロジェクトは元々<a href='%1'>eePe</a>から派生しました - + If you've found this program useful, please support by <a href='%1'>donating</a> このプログラムが役に立つと感じた場合は、<a href='%1'>寄付</a>でのサポートをお願いします - + Copyright OpenTX Team Copyright OpenTX Team - + About Companion Companionについて - + OpenTX Companion %1 - Radio: %2 - Profile: %3 OpenTX Companion %1 - 送信機: %2 - プロファイル: %3 - + New 新規 - + Create a new Models and Settings file 新規モデルと設定ファイルを作成します - + Open... 開く... - + Save 保存 - - + + Save Models and Settings file 機体モデルと設定ファイルを保存します - + Save As... 名前を付けて保存... - + Close 閉じる - + Close Models and Settings file 機体モデルと設定ファイルを閉じます - + Exit 終了 - + Exit the application アプリケーションを終了します - + About... バージョン情報... - + Show the application's About box アプリケーションのバージョン情報を表示します - + Recent Files 最近使用したファイル - + List of recently used files 最近使用したファイルを一覧表示 - + Radio Profiles 送信機プロファイル - + Create or Select Radio Profiles 送信機プロファイルを作成または選択します - + View Log File... ログファイルを表示... - + Open and view log file ログファイルを開いて表示します - + Settings... 設定... - + Edit Settings 設定を編集します - + Download... ダウンロード... - + Download firmware and voice files ファームウェアと音声ファイルをダウンロードします - + Check for Updates... アップデートのチェック... - + Check OpenTX and Companion updates OpenTXとCompanionのアップデートを確認します - + Release notes... リリースノート... - + Show release notes リリースノートを表示します - + Compare Models... 機体モデルを比較... - + Compare models 機体モデルを比較します - + Edit Radio Splash Image... 送信機の起動イメージを編集... - + Edit the splash image of your Radio 送信機の起動イメージを編集します - + List programmers... プログラムを一覧表示... - + List available programmers 利用可能なプログラムを一覧表示します - + Fuses... ヒューズ... - + Show fuses dialog ヒューズダイアログを表示します - + Read firmware from Radio 送信機からファームウェアを読み込み - + Write Firmware to Radio 送信機にファームウェアを書き込み - + Write firmware to Radio 送信機にファームウェアを書き込み - + SD card synchronization SDカードの同期 - + Manuals and other Documents マニュアルと他の文書 - + Open the OpenTX document page in a web browser WebブラウザでOpenTXドキュメントページを開く - + Write Models and Settings To Radio 機体モデルと設定を送信機に書き込み - + Write Models and Settings to Radio 機体モデルと設定を送信機に書き込み - + Read Models and Settings From Radio 送信機から機体モデルや設定を読み込み - + Configure Communications... 送信機疎通を設定... - + Configure software for communicating with the Radio 送信機と疎通するためのソフトウェアを設定します - + Write Backup to Radio 送信機からバックアップを書き出す - + Write Backup from file to Radio 送信機ファイルからバックアップを書き出します - + Backup Radio to File ファイルを送信機にバックアップ - + Save a complete backup file of all settings and model data in the Radio すべての設定とモデルデータの完全なバックアップファイルを送信機に保存します - + Contributors... 貢献者... - + A tribute to those who have contributed to OpenTX and Companion OpenTXとCompanionに貢献した人々への賛辞 - + Add Radio Profile 送信機プロファイルの追加 - + Create a new Radio Settings Profile 新しい送信機設定プロファイルを作成します - + Copy Current Radio Profile 現在の送信機プロファイルをコピー - + Duplicate current Radio Settings Profile 現在の送信機設定プロファイルを複製します - + Delete Current Radio Profile... 現在の送信機プロファイルを削除... - + Delete the current Radio Settings Profile 現在の送信機設定プロファイルを削除します - + Export Application Settings.. アプリケーション設定のエクスポート.. - + Save all the current %1 and Simulator settings (including radio profiles) to a file. 現在のすべての%1およびシミュレータ設定(送信機プロファイル含)をファイルに保存します。 - + Import Application Settings.. アプリケーション設定をインポート.. - + Load %1 and Simulator settings from a prevously exported settings file. 以前にエクスポートした設定ファイルから%1とシミュレーション設定を読み込みます。 - + Tabbed Windows タブ付きウィンドウ - + Use tabs to arrange open windows. 開いているウィンドウを並べ替えるのにタブを使用します。 - + Tile Windows ウィンドウのタイトル - + Arrange open windows across all the available space. 利用可能なすべてのスペースに開いているウィンドウを配置します。 - + Cascade Windows ウィンドウを重ねる - + Arrange all open windows in a stack. 開いているウィンドウをすべて重ねて配置します。 - + Close All Windows すべてのウィンドウを閉じる - + Closes all open files (prompts to save if necessary. 開いているファイルをすべて閉じます (必要に応じ保存を求められます)。 - - + + Edit 編集 - - + + File ファイル - + Settings 設定 - + Set Icon Theme アイコンテーマ設定 - + Set Icon Size アイコンサイズ設定 - + Read/Write 読み込み/書き込み - + Window ウィンドウ - - + + Help ヘルプ - + Write 書き込み - + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. 次にCompanionを起動するまで一部のテキストは翻訳されません。いくつかの翻訳は完全ではないかもしれませんのでご注意ください。 - + Ctrl+Shift+S - + Ctrl+Alt+L - + Ctrl+Alt+D - + Ctrl+Alt+R - + Classical クラシック - + The classic companion9x icon theme クラシック Companion9x アイコンテーマ - + Yerico イェリコ - + Yellow round honey sweet icon theme Yellow round honey sweet アイコンテーマ - + Monochrome モノクローム - + A monochrome black icon theme A monochrome black アイコンテーマ - + MonoBlue モノブルー - + A monochrome blue icon theme A monochrome blue アイコンテーマ - + MonoWhite モノホワイト - + A monochrome white icon theme A monochrome white アイコンテーマ - + Small 小サイズ - + Use small toolbar icons 小サイズのツールバーアイコンを使用 - + Normal 標準サイズ - + Use normal size toolbar icons 標準サイズのツールバーアイコンを使用 - + Big 大サイズ - + Use big toolbar icons 大サイズのツールバーアイコンを使用 - + Huge 特大サイズ - + Use huge toolbar icons 特大サイズのツールバーアイコンを使用 - + Set Menu Language メニュー言語を設定 - + System language システム言語 - + Use default system language. デフォルトのシステム言語を使用します。 - + Use %1 language (some translations may not be complete). %1言語を使用します (一部の翻訳が不完全な場合あり)。 - + Ready 準備完了 - + %2 %2 - + Alt+%1 - + New Radio 新規 送信機 - + - Copy - コピー - + Companion :: Open files warning Companion :: ファイルを開くときの警告 - + Please save or close modified file(s) before deleting the active profile. 有効なプロファイルを削除する前に、変更したファイルを保存するか閉じてください。 - + Not possible to remove profile プロファイルを削除できません - + The default profile can not be removed. デフォルトプロファイルは削除できません。 - + Confirm Delete Profile プロファイル削除の確認 - + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! 『%1』送信機プロファイルを削除してもよろしいですか?この操作を元に戻すことはできません! - + Please save or close all modified files before importing settings 設定をインポートする前に、変更したファイルをすべて保存するか閉じてください - + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> <html><p>%1とシミュレータの設定は、以前に保存したエクスポート(バックアップ)ファイルからインポート(復元)できます。これにより、現在の設定がファイル内の設定に置き換えられます。</p><p>現在の設定の自動バックアップが実行されます。ただし、現在の設定が便利な場合は、まず手動バックアップを作成することをお勧めします。</p><p>設定をインポートし最良の結果を得るには、<b>開いている%1ウィンドウをすべて閉じます。スタンドアロンのシミュレーターアプリケーションが実行されていません。</p><p>続行しますか?</p></html> - + Confirm Settings Import 設定のインポートの確認 - + Select %1: %1を選択: - + backup バックアップ - + Press the 'Ignore' button to continue anyway. とにかく続行するには『無視』ボタンを押してください。 - + The settings could not be imported. 設定をインポートできませんでした。 - + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> <html><p>新しい設定は次の場所からインポートされました。<br>%1.</p><p>%2は再初期化されます。</p><p>場合によっては閉じて再起動する必要があります。言語やアイコンテーマなどの設定が有効になる前に%2が発生しました。</p> - + <p>The previous settings were backed up to:<br> %1</p> <p>以前の設定は次の場所にバックアップされました:<br> %1</p> @@ -7194,159 +7484,164 @@ Do you wish to continue? 空き容量 - + + read only + 読み取りのみ + + + New category Translators do NOT use accent for this, this is the default category name on Horus. 新規カテゴリ - + Category index out of range. カテゴリインデックスが範囲外です。 - + Cannot delete the last category. 最後のカテゴリは削除できません。 - + This category is not empty! このカテゴリは空ではありません! - + Cannot insert model, last model in list would be deleted. 機体モデルを挿入できません。リストの最後のモデルが削除されます。 - + Cannot add model, could not find an available model slot. 機体モデルを追加できません。利用可能なモデルスロットが見つかりません。 - + New model Translators: do NOT use accents here, this is a default model name. 新規モデル - + Cannot paste model, out of available model slots. 利用可能なモデルスロットから、機体モデルを貼り付けることができません。 - + You are replacing an existing model, are you sure? 既存の機体モデルを差し替えます。よろしいですか? - + Do you want to overwrite radio general settings? 送信機の一般設定を上書きしますか? - + Delete %n selected model(s)? 選択した機体モデルを %n つ削除しますか? - + Delete %n selected category(ies)? 選択したカテゴリ(ies)を %n つ削除しますか? - + Cannot duplicate model, could not find an available model slot. 機体モデルを複製できません。利用なモデルスロットが見つかりません。 - + Editing model %1: 機体モデル %1 を編集しています: - + Save As 名前を付けて保存 - + %1 has been modified. Do you want to save your changes? %1 は変更されました。 変更を保存しますか? - + <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> <p><b>現在選択されている送信機タイプ (%1) はファイル %3 (from %2) と互換性がありません。機体モデルと設定を変換する必要があります。</b></p> - + Do you wish to continue with the conversion? 変換を続けますか? - + Choose <i>Apply</i> to convert the file, or <i>Close</i> to close it without conversion. ファイルを変換するには<i>適用</i>を、変換せずに閉じるには<i>閉じる</i>を選択します。 - + <b>The conversion generated some important messages, please review them below.</b> <b>変換によっていくつかの重要なメッセージが出力されました。下記の内容を確認してください。</b> - + Companion :: Conversion Result for %1 Companion :: %1 の変換結果 - - Unable to find Horus radio SD card! - Horus送信機のSDカードが見つかりません! + + Unable to find radio SD card! + 送信機のSDカードが見つかりません! - + Models and Settings written 機体モデルと設定が書かれました - + Cannot write temporary file! 一時ファイルを書き込めません! - + Open backup Models and Settings file バックアップ機体モデルと設定ファイルを開く - + Unable to find file %1! ファイル %1 が見つかりません! - + Error opening file %1: %2. ファイル %1 を開くときにエラーが発生しました: %2. - + Error reading file %1: %2. ファイル %1 の読み取りエラーです: %2. - + Invalid binary backup File %1 無効なバイナリバックアップファイルです %1 @@ -7354,12 +7649,12 @@ Do you want to save your changes? MixData - + MIX ミックス - + (@%1) @@ -7754,12 +8049,12 @@ If blank then the mix is considered to be "ON" all the time. ModelData - + Model: 機体モデル: - + Throttle Source スロットル値 @@ -8700,12 +8995,7 @@ If blank then the mix is considered to be "ON" all the time. 受信機 3 - - Bind on startup - 起動時バインド - - - + Low Power 低パワー @@ -8715,158 +9005,183 @@ If blank then the mix is considered to be "ON" all the time. 警告: 送信出力を変更するには再バインドが必要です - + Channels チャンネル - + PPM delay PPM 遅延 - + us - + PPM Frame Length PPM フレーム長 - + ms ms - + Antenna アンテナ - + Output type 出力タイプ - + Open Drain オープン ドレン - + Push Pull プッシュ プル - + Option value オプション値 - + Protocol プロトコル - + Registration ID 登録ID - + Multi Radio Protocol マルチプロトコル - + Sub Type サブタイプ - + Failsafe Mode フェイルセーフモード - + Not set 設定なし - + Hold ホールド - + Custom カスタム - + No Pulses パルスなし - + Receiver 受信機 - + Trainer Mode トレーナーモード - + Master/Jack マスター/Jack - + Slave/Jack スレーブ/Jack - + Master/SBUS Module マスター/SBUSモジュール - + Master/CPPM Module マスター/CPPMモジュール - + Master/SBUS in battery compartment マスター/バッテリーカバー内SBUB - + WARNING: Requires non-certified firmware! 警告: 未認定のR9Mファームウェアが必要です! - + + Master/Bluetooth + マスター/Bluetooth + + + + Slave/Bluetooth + スレーブ/Bluetooth + + + + Master/Multi + マスター/Multi + + + + Disable Telemetry + テレメトリー無効 + + + + Disable Ch. Map + チャンネルマップ無効 + + + Failsafe Positions フェイルセーフポジション - + Show values in: 値の表示: - + % abbreviation for percent - + μs abbreviation for microseconds @@ -8948,12 +9263,12 @@ If blank then the mix is considered to be "ON" all the time. 100mW - 16CH (テレメトリーなし) - + Positive ノーマル - + Negative リバース @@ -8961,40 +9276,50 @@ If blank then the mix is considered to be "ON" all the time. ModulePanel - + Value 値 - + Hold ホールド - + No Pulse パルスなし - + Ask 確認 - + Internal 内部 - + Internal + External 内部 + 外部 - + External 外部 + + + Autodetect Format + フォーマット自動検出 + + + + Bind on channel + チャンネルへバインド + MultiModelPrinter @@ -9492,11 +9817,6 @@ If blank then the mix is considered to be "ON" all the time. DEFAULT 初期値 - - - Custom - proto %1) - カスタム - プロトコル%1) - MultirotorPage @@ -9524,22 +9844,22 @@ If blank then the mix is considered to be "ON" all the time. OpenTxEepromInterface - + Unknown error 不明のエラー - + ... plus %1 errors ...追加 %1 エラー - + Cannot write radio settings 送信機設定を書き込めません - + Cannot write model %1 機体モデル %1 を書き込めません @@ -9644,6 +9964,19 @@ If blank then the mix is considered to be "ON" all the time. ODFファイル (*.odt);;PDFファイル (*.pdf);;HTMLファイル (*.htm *.html);;すべてのファイル (*) + + ProfileChooserDialog + + + Select Profile + プロファイル選択 + + + + Profile + プロファイル + + ProgressDialog @@ -9812,8 +10145,8 @@ If blank then the mix is considered to be "ON" all the time. - Unable to find Horus radio SD card! - Horus送信機のSDカードが見つかりません! + Unable to find radio SD card! + 送信機のSDカードが見つかりません! @@ -10750,7 +11083,12 @@ X - + + ml/minute + + + + TELE @@ -10930,25 +11268,90 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi SetupPanel - + + Popup menu available + 利用可能なポップアップメニュー + + + Timer %1 タイマー %1 - + THR - + Profile Settings プロファイル設定 - + SD structure path not specified or invalid SDカード保存先パスが指定されていないか無効です + + + Copy + コピー + + + + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Timer. Are you sure? + タイマーを消去します。よろしいですか? + + + + Clear all Timers. Are you sure? + タイマーをすべて消去します。よろしいですか? + + + + Delete Timer. Are you sure? + タイマーを削除します。よろしいですか? + SimpleTailPage @@ -11671,62 +12074,62 @@ The default is configured in the chosen Radio Profile. 送信機シミュレータ (%1) - + Could not determine startup data source. 起動データ元を特定できませんでした。 - + Could not load data, possibly wrong format. データをロードできません、フォーマットが間違っている可能性があります。 - + Data Load Error データロード エラー - + Invalid startup data provided. Plese specify a proper file/path. 無効なスタートアップデータが提供されました。正しいファイル/パスを指定してください。 - + Simulator Startup Error シミュレータ スタートアップ エラー - + Error saving data: could open file for writing: '%1' データ保存エラー: 書き込み用にファイルを開くことができました: 「%1」 - + Error saving data: could not get data from simulator interface. データ保存エラー: シミュレータのインターフェイスからデータを取得できませんでした。 - + An unexpected error occurred while attempting to save radio data to file '%1'. 送信機データをファイル「%1」に保存しようとしたときに予期せぬエラーが発生しました。 - + Data Save Error データ保存 エラー - + Cannot open joystick, joystick disabled スティックが接続不可、もしくはスティックが無効です - + Radio firmware error: %1 送信機 ファームウェア エラー: %1 - + - Flight Mode %1 (#%2) - フライトモード %1 (#%2) @@ -12427,104 +12830,104 @@ Too many errors, giving up. TelemetryPanel - + Telemetry screen %1 テレメトリースクリーン %1 - + FrSky S.PORT - + FrSky D - + FrSky D (cable) - + Source 信号元 - + Low Alarm 低アラーム - + Critical Alarm クリティカルアラーム - + Winged Shadow How High Winged Shadow How High - + Winged Shadow How High (not supported) Winged Shadow How High (サポートなし) - + Alti - + Alti+ - + VSpeed - - - + + + A1 - - - + + + A2 - - + + A3 - - + + A4 - - + + FAS - + Cells セル - + --- --- @@ -12537,274 +12940,284 @@ Too many errors, giving up. フォーム - + + TELE## + TELE## + + + Custom カスタム - + Calculated 計算値 - + Id ID - + Instance インスタンス - + Rx 受信 - + Add 追加 - + Average 平均 - + Min 最小 - + Max 最大 - + Multiply 乗算 - + Totalize 合計 - + Cell セル - + Consumption 消費 - + Dist 距離 - + Cells Sensor : セル センサー : - - - - - - - - + + + + + + + + --- --- - + GPS Sensor : GPS センサー : - + Alt. Sensor : 高度 センサー : - + Sensor : センサー : - + Raw (-) Raw (-) - + V V - + A - + mA - + kt - + m/s - + ft/s - + km/h - + mph - + m 分 - + ft - + °C - + °F - + % - + mAh - + W - + mW - + dBm - + RPM - + g - + ° - + Rad - + mL - + US fl.Oz. - + + ml/min + + + + Precision 精度 - + Ratio レシオ - + Blades ブレード - + Offset オフセット - + Multiplier 乗算 - + Auto Offset 自動オフセット - + Filter フィルタ - + Persistent 持続 - + Positive ノーマル - + Logs ログ @@ -12812,25 +13225,70 @@ Too many errors, giving up. TelemetrySensorPanel - + + TELE%1 + + + + + Popup menu available + 利用可能なポップアップメニュー + + + Lowest より低く - + Cell %1 セル %1 - + Highest より高く - + Delta 差分 + + + Copy + コピー + + + + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Clear All + すべて消去 + + + + Clear Telemetry Sensor. Are you sure? + テレメトリーセンサーを消去します。よろしいですか? + + + + Clear all Telemetry Sensors. Are you sure? + テレメトリーセンサーのすべてを消去します。よろしいですか? + TelemetrySimulator @@ -13209,12 +13667,12 @@ hh:mm:ss TimerData - + TMR - + Timer %1 タイマー %1 @@ -14192,119 +14650,4 @@ Press Cancel to abort joystick calibration without saving. キャリブレーションが完了していません。そのまま保存しますか? - - preferencesDialog - - - Preferences - 設定 - - - - Simu BackLight - シミュレータ バックライト - - - - Simulator capture folder - シミュレータ キャプチャフォルダ - - - - Joystick - スティック - - - - Remember simulator switches - シミュレータスイッチの記憶 - - - - Enable - 有効 - - - - Use clipboard only - クリップボードのみを使用 - - - - Calibrate - キャリブレート - - - - Blue - 青色 - - - - Green - 緑色 - - - - Red - 赤色 - - - - Orange - オレンジ - - - - Yellow - 黄色 - - - - - Open Folder - フォルダを開く - - - - Personal splash library - 個人イメージライブラリ - - - - Include companion splashes - 標準Companion起動イメージ - - - - Only user defined splashes - ユーザ設定の起動イメージのみ - - - - Splash library behaviour - 起動イメージライブラリの動作 - - - - Custom TX splash screen - カスタム起動イメージ - - - - Open Image - イメージを開く - - - - - ... - ... - - - - Invert Pixels - ピクセルを反転 - - diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua index ff6a3254c..d0a7d4af8 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua @@ -21,19 +21,41 @@ -- To start operation: -- Write "HoTT" at address 0..3 -- Write 0xFF at address 4 will request the buffer to be cleared --- Write 0xDF at address 5 +-- Write 0x0F at address 5 -- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters -- by 8 lines --- Write at address 5 sends an order to the RX: 0xDF=start, 0xD7=prev page, --- 0xDE=next page, 0xD9=enter, 0xDD=next or 0xDB=prev +-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page, +-- 0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor +-- to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM -- Write at address 4 the value 0xFF will request the buffer to be cleared -- !! Before exiting the script must write 0 at address 0 for normal operation !! --############################################################################### +HoTT_Sensor = 0 +Timer_128 = 100 + local function HoTT_Release() multiBuffer( 0, 0 ) end +local function HoTT_Send(button) + multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button) +end + +local function HoTT_Sensor_Inc() + local detected_sensors=multiBuffer( 4 ) + local a + if detected_sensors ~= 0xFF then + repeat + HoTT_Sensor=(HoTT_Sensor+1)%7 -- Switch to next sensor + if HoTT_Sensor ~= 0 then + a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right + end + until HoTT_Sensor==0 or a % 2 == 1 + HoTT_Send( 0x0F ) + end +end + local function HoTT_Draw_LCD() local i local value @@ -41,12 +63,14 @@ local function HoTT_Draw_LCD() local result local offset=0 + local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" } + lcd.clear() if LCD_W == 480 then --Draw title lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, "Graupner HoTT RX configuration", MENU_TITLE_COLOR) + lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR) --Draw RX Menu if multiBuffer( 4 ) == 0xFF then lcd.drawText(10,50,"No HoTT telemetry...", BLINK) @@ -56,9 +80,9 @@ local function HoTT_Draw_LCD() value=multiBuffer( line*21+6+i ) if value > 0x80 then value = value - 0x80 - lcd.drawText(10+i*16,32+16*line,string.char(value).." ",INVERS) + lcd.drawText(10+i*16,32+20*line,string.char(value).." ",INVERS) else - lcd.drawText(10+i*16,32+16*line,string.char(value)) + lcd.drawText(10+i*16,32+20*line,string.char(value)) end end end @@ -68,14 +92,23 @@ local function HoTT_Draw_LCD() if multiBuffer( 4 ) == 0xFF then lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE) else - for line = 0, 7, 1 do - for i = 0, 21-1, 1 do - value=multiBuffer( line*21+6+i ) - if value > 0x80 then - value = value - 0x80 - lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) - else - lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + if Timer_128 ~= 0 then + --Intro page + Timer_128 = Timer_128 - 1 + lcd.drawScreenTitle("Graupner Hott",0,0) + lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE) + lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE) + else + --Menu page + for line = 0, 7, 1 do + for i = 0, 21-1, 1 do + value=multiBuffer( line*21+6+i ) + if value > 0x80 then + value = value - 0x80 + lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) + else + lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + end end end end @@ -98,7 +131,10 @@ local function HoTT_Init() --Request init of the RX buffer multiBuffer( 4, 0xFF ) --Request RX to send the config menu - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) + HoTT_Sensor = 0; + HoTT_Detected_Sensors=0; + Timer_128 = 100 end -- Main @@ -111,18 +147,21 @@ local function HoTT_Run(event) return 2 else if event == EVT_VIRTUAL_PREV_PAGE then - killEvents(event); - multiBuffer( 5, 0xD7 ) - elseif event == EVT_VIRTUAL_NEXT_PAGE then - multiBuffer( 5, 0xDE ) + killEvents(event) + HoTT_Send( 0x07 ) elseif event == EVT_VIRTUAL_ENTER then - multiBuffer( 5, 0xD9 ) - elseif event == EVT_VIRTUAL_NEXT then - multiBuffer( 5, 0xDD ) + HoTT_Send( 0x09 ) elseif event == EVT_VIRTUAL_PREV then - multiBuffer( 5, 0xDB ) + HoTT_Send( 0x0B ) + elseif event == EVT_VIRTUAL_NEXT then + HoTT_Send( 0x0D ) + elseif event == EVT_VIRTUAL_NEXT_PAGE then + HoTT_Send( 0x0E ) + elseif event == EVT_VIRTUAL_MENU then + Timer_128 = 100 + HoTT_Sensor_Inc() else - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) end HoTT_Draw_LCD() return 0 diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua index c6361454e..c06f6544c 100644 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua @@ -149,14 +149,13 @@ local function runMotorConfig(event) lcd.drawBitmap(BackgroundImg, 0, 0) lcd.drawBitmap(ImgPageDn, 455, 95) lcd.drawBitmap(ImgEngine, 310, 50) - lcd.setColor(CUSTOM_COLOR, lcd.RGB(255, 255, 255)) fields = MotorFields lcd.drawText(40, 20, "Does your model have a motor ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 200, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) fields[2][4]=0 if fields[1][5] == 1 then lcd.drawText(40, 100, "What channel is it on ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) fields[2][4]=1 end local result = runFieldsPage(event) @@ -190,7 +189,7 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 395, 235) drawMark(308, 115, "A") drawMark(422, 220, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -198,16 +197,16 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 395, 235) drawMark(308, 115, "A") drawMark(422, 220, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Number of ailerons on your model ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -235,7 +234,7 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 358, 202) drawMark(332, 132, "A") drawMark(412, 215, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -243,16 +242,16 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 358, 202) drawMark(332, 132, "A") drawMark(412, 215, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Does your model have flaps ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -283,7 +282,7 @@ local function runTailConfig(event) lcd.drawBitmap(ImgTail, 252, 100) drawMark(360, 125, "A") drawMark(390, 155, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0, 0) end @@ -293,9 +292,9 @@ local function runTailConfig(event) drawMark(415, 150, "A") drawMark(380, 120, "A") drawMark(390, 185, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end @@ -305,11 +304,11 @@ local function runTailConfig(event) drawMark(415, 150, "C") drawMark(380, 120, "A") drawMark(390, 185, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") - lcd.drawFilledRectangle(40, 202, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) drawMark(152, 204, "C") setFieldsVisible(1, 1, 1) end @@ -317,14 +316,14 @@ local function runTailConfig(event) lcd.drawBitmap(ImgVTail, 252, 100) drawMark(315, 110, "A") drawMark(382, 120, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end lcd.drawText(40, 20, "Pick the tail config of your model", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua index 0000673d1..f970cc998 100755 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua @@ -144,19 +144,18 @@ local ImgEngine local function runMotorConfig(event) lcd.clear() if ImgEngine == nil then - ImgEngine = Bitmap.open("img/prop.png") + ImgEngine = Bitmap.open("img/prop.png") end lcd.drawBitmap(BackgroundImg, 0, 0) lcd.drawBitmap(ImgPageDn, 455, 95) lcd.drawBitmap(ImgEngine, 310, 50) - lcd.setColor(CUSTOM_COLOR, lcd.RGB(255, 255, 255)) fields = MotorFields lcd.drawText(40, 20, "Does your model have a motor ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 200, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) fields[2][4]=0 if fields[1][5] == 1 then lcd.drawText(40, 100, "What channel is it on ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) fields[2][4]=1 end local result = runFieldsPage(event) @@ -190,7 +189,7 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 275, 210) drawMark(362, 132, "A") drawMark(302, 227, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -198,16 +197,16 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 275, 210) drawMark(362, 132, "A") drawMark(302, 227, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Number of ailerons on your model ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -235,7 +234,7 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 285, 191) drawMark(362, 132, "A") drawMark(302, 227, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -243,16 +242,16 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 285, 191) drawMark(362, 132, "A") drawMark(302, 227, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Does your model have flaps ?", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -283,7 +282,7 @@ local function runTailConfig(event) lcd.drawBitmap(ImgTail, 252, 100) drawMark(275, 120, "A") drawMark(390, 155, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0, 0) end @@ -293,9 +292,9 @@ local function runTailConfig(event) drawMark(275, 120, "A") drawMark(390, 155, "A") drawMark(370, 112, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end @@ -305,11 +304,11 @@ local function runTailConfig(event) drawMark(275, 120, "A") drawMark(390, 155, "C") drawMark(370, 112, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") - lcd.drawFilledRectangle(40, 202, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) drawMark(152, 204, "C") setFieldsVisible(1, 1, 1) end @@ -317,14 +316,14 @@ local function runTailConfig(event) lcd.drawBitmap(ImgVTail, 252, 100) drawMark(315, 110, "A") drawMark(382, 120, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end lcd.drawText(40, 20, "Pick the tail config of your model", DEFAULT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua index ff6a3254c..d0a7d4af8 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua @@ -21,19 +21,41 @@ -- To start operation: -- Write "HoTT" at address 0..3 -- Write 0xFF at address 4 will request the buffer to be cleared --- Write 0xDF at address 5 +-- Write 0x0F at address 5 -- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters -- by 8 lines --- Write at address 5 sends an order to the RX: 0xDF=start, 0xD7=prev page, --- 0xDE=next page, 0xD9=enter, 0xDD=next or 0xDB=prev +-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page, +-- 0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor +-- to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM -- Write at address 4 the value 0xFF will request the buffer to be cleared -- !! Before exiting the script must write 0 at address 0 for normal operation !! --############################################################################### +HoTT_Sensor = 0 +Timer_128 = 100 + local function HoTT_Release() multiBuffer( 0, 0 ) end +local function HoTT_Send(button) + multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button) +end + +local function HoTT_Sensor_Inc() + local detected_sensors=multiBuffer( 4 ) + local a + if detected_sensors ~= 0xFF then + repeat + HoTT_Sensor=(HoTT_Sensor+1)%7 -- Switch to next sensor + if HoTT_Sensor ~= 0 then + a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right + end + until HoTT_Sensor==0 or a % 2 == 1 + HoTT_Send( 0x0F ) + end +end + local function HoTT_Draw_LCD() local i local value @@ -41,12 +63,14 @@ local function HoTT_Draw_LCD() local result local offset=0 + local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" } + lcd.clear() if LCD_W == 480 then --Draw title lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, "Graupner HoTT RX configuration", MENU_TITLE_COLOR) + lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR) --Draw RX Menu if multiBuffer( 4 ) == 0xFF then lcd.drawText(10,50,"No HoTT telemetry...", BLINK) @@ -56,9 +80,9 @@ local function HoTT_Draw_LCD() value=multiBuffer( line*21+6+i ) if value > 0x80 then value = value - 0x80 - lcd.drawText(10+i*16,32+16*line,string.char(value).." ",INVERS) + lcd.drawText(10+i*16,32+20*line,string.char(value).." ",INVERS) else - lcd.drawText(10+i*16,32+16*line,string.char(value)) + lcd.drawText(10+i*16,32+20*line,string.char(value)) end end end @@ -68,14 +92,23 @@ local function HoTT_Draw_LCD() if multiBuffer( 4 ) == 0xFF then lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE) else - for line = 0, 7, 1 do - for i = 0, 21-1, 1 do - value=multiBuffer( line*21+6+i ) - if value > 0x80 then - value = value - 0x80 - lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) - else - lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + if Timer_128 ~= 0 then + --Intro page + Timer_128 = Timer_128 - 1 + lcd.drawScreenTitle("Graupner Hott",0,0) + lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE) + lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE) + else + --Menu page + for line = 0, 7, 1 do + for i = 0, 21-1, 1 do + value=multiBuffer( line*21+6+i ) + if value > 0x80 then + value = value - 0x80 + lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) + else + lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + end end end end @@ -98,7 +131,10 @@ local function HoTT_Init() --Request init of the RX buffer multiBuffer( 4, 0xFF ) --Request RX to send the config menu - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) + HoTT_Sensor = 0; + HoTT_Detected_Sensors=0; + Timer_128 = 100 end -- Main @@ -111,18 +147,21 @@ local function HoTT_Run(event) return 2 else if event == EVT_VIRTUAL_PREV_PAGE then - killEvents(event); - multiBuffer( 5, 0xD7 ) - elseif event == EVT_VIRTUAL_NEXT_PAGE then - multiBuffer( 5, 0xDE ) + killEvents(event) + HoTT_Send( 0x07 ) elseif event == EVT_VIRTUAL_ENTER then - multiBuffer( 5, 0xD9 ) - elseif event == EVT_VIRTUAL_NEXT then - multiBuffer( 5, 0xDD ) + HoTT_Send( 0x09 ) elseif event == EVT_VIRTUAL_PREV then - multiBuffer( 5, 0xDB ) + HoTT_Send( 0x0B ) + elseif event == EVT_VIRTUAL_NEXT then + HoTT_Send( 0x0D ) + elseif event == EVT_VIRTUAL_NEXT_PAGE then + HoTT_Send( 0x0E ) + elseif event == EVT_VIRTUAL_MENU then + Timer_128 = 100 + HoTT_Sensor_Inc() else - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) end HoTT_Draw_LCD() return 0 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua index f4677ed4e..321b7324f 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua @@ -165,8 +165,8 @@ end -- Init function local function init() thrCH1 = defaultChannel(2) - rollCH1 = defaultChannel(0) - yawCH1 = defaultChannel(3) + rollCH1 = defaultChannel(3) + yawCH1 = defaultChannel(0) pitchCH1 = defaultChannel(1) local ver, radio, maj, minor, rev = getVersion() if string.match(radio, "x7") then diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua index ff6a3254c..d0a7d4af8 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua @@ -21,19 +21,41 @@ -- To start operation: -- Write "HoTT" at address 0..3 -- Write 0xFF at address 4 will request the buffer to be cleared --- Write 0xDF at address 5 +-- Write 0x0F at address 5 -- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters -- by 8 lines --- Write at address 5 sends an order to the RX: 0xDF=start, 0xD7=prev page, --- 0xDE=next page, 0xD9=enter, 0xDD=next or 0xDB=prev +-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page, +-- 0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor +-- to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM -- Write at address 4 the value 0xFF will request the buffer to be cleared -- !! Before exiting the script must write 0 at address 0 for normal operation !! --############################################################################### +HoTT_Sensor = 0 +Timer_128 = 100 + local function HoTT_Release() multiBuffer( 0, 0 ) end +local function HoTT_Send(button) + multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button) +end + +local function HoTT_Sensor_Inc() + local detected_sensors=multiBuffer( 4 ) + local a + if detected_sensors ~= 0xFF then + repeat + HoTT_Sensor=(HoTT_Sensor+1)%7 -- Switch to next sensor + if HoTT_Sensor ~= 0 then + a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right + end + until HoTT_Sensor==0 or a % 2 == 1 + HoTT_Send( 0x0F ) + end +end + local function HoTT_Draw_LCD() local i local value @@ -41,12 +63,14 @@ local function HoTT_Draw_LCD() local result local offset=0 + local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" } + lcd.clear() if LCD_W == 480 then --Draw title lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, "Graupner HoTT RX configuration", MENU_TITLE_COLOR) + lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR) --Draw RX Menu if multiBuffer( 4 ) == 0xFF then lcd.drawText(10,50,"No HoTT telemetry...", BLINK) @@ -56,9 +80,9 @@ local function HoTT_Draw_LCD() value=multiBuffer( line*21+6+i ) if value > 0x80 then value = value - 0x80 - lcd.drawText(10+i*16,32+16*line,string.char(value).." ",INVERS) + lcd.drawText(10+i*16,32+20*line,string.char(value).." ",INVERS) else - lcd.drawText(10+i*16,32+16*line,string.char(value)) + lcd.drawText(10+i*16,32+20*line,string.char(value)) end end end @@ -68,14 +92,23 @@ local function HoTT_Draw_LCD() if multiBuffer( 4 ) == 0xFF then lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE) else - for line = 0, 7, 1 do - for i = 0, 21-1, 1 do - value=multiBuffer( line*21+6+i ) - if value > 0x80 then - value = value - 0x80 - lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) - else - lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + if Timer_128 ~= 0 then + --Intro page + Timer_128 = Timer_128 - 1 + lcd.drawScreenTitle("Graupner Hott",0,0) + lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE) + lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE) + else + --Menu page + for line = 0, 7, 1 do + for i = 0, 21-1, 1 do + value=multiBuffer( line*21+6+i ) + if value > 0x80 then + value = value - 0x80 + lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) + else + lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + end end end end @@ -98,7 +131,10 @@ local function HoTT_Init() --Request init of the RX buffer multiBuffer( 4, 0xFF ) --Request RX to send the config menu - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) + HoTT_Sensor = 0; + HoTT_Detected_Sensors=0; + Timer_128 = 100 end -- Main @@ -111,18 +147,21 @@ local function HoTT_Run(event) return 2 else if event == EVT_VIRTUAL_PREV_PAGE then - killEvents(event); - multiBuffer( 5, 0xD7 ) - elseif event == EVT_VIRTUAL_NEXT_PAGE then - multiBuffer( 5, 0xDE ) + killEvents(event) + HoTT_Send( 0x07 ) elseif event == EVT_VIRTUAL_ENTER then - multiBuffer( 5, 0xD9 ) - elseif event == EVT_VIRTUAL_NEXT then - multiBuffer( 5, 0xDD ) + HoTT_Send( 0x09 ) elseif event == EVT_VIRTUAL_PREV then - multiBuffer( 5, 0xDB ) + HoTT_Send( 0x0B ) + elseif event == EVT_VIRTUAL_NEXT then + HoTT_Send( 0x0D ) + elseif event == EVT_VIRTUAL_NEXT_PAGE then + HoTT_Send( 0x0E ) + elseif event == EVT_VIRTUAL_MENU then + Timer_128 = 100 + HoTT_Sensor_Inc() else - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) end HoTT_Draw_LCD() return 0 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua index 3296626ad..c78b982a9 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua @@ -164,8 +164,8 @@ end -- Init function local function init() thrCH1 = defaultChannel(2) - rollCH1 = defaultChannel(0) - yawCH1 = defaultChannel(3) + rollCH1 = defaultChannel(3) + yawCH1 = defaultChannel(0) pitchCH1 = defaultChannel(1) local ver, radio, maj, minor, rev = getVersion() -- if string.match(radio, "x7") then diff --git a/radio/src/audio.h b/radio/src/audio.h index 80751d12d..c6d688434 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -18,8 +18,8 @@ * GNU General Public License for more details. */ -#ifndef _AUDIO_ARM_H_ -#define _AUDIO_ARM_H_ +#ifndef _AUDIO_H_ +#define _AUDIO_H_ #include #include @@ -66,8 +66,11 @@ template class BitField { #define INDEX_LOGICAL_SWITCH_AUDIO_FILE(index, event) (2*(index)+(event)) #define INDEX_PHASE_AUDIO_FILE(index, event) (2*(index)+(event)) +// max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) +constexpr uint8_t AUDIO_MODEL_FILENAME_MAXLEN = (sizeof("/SOUNDS/fr/") - 1) + LEN_MODEL_NAME + 1 + LEN_FLIGHT_MODE_NAME + (sizeof("-off.wav") - 1); +constexpr uint8_t AUDIO_LUA_FILENAME_MAXLEN = 42; // Some scripts use long audio paths, even on 128x64 boards +constexpr uint8_t AUDIO_FILENAME_MAXLEN = (AUDIO_LUA_FILENAME_MAXLEN > AUDIO_MODEL_FILENAME_MAXLEN ? AUDIO_LUA_FILENAME_MAXLEN : AUDIO_MODEL_FILENAME_MAXLEN); -#define AUDIO_FILENAME_MAXLEN (42) // max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) #define AUDIO_QUEUE_LENGTH (16) // must be a power of 2! #define AUDIO_SAMPLE_RATE (32000) @@ -85,8 +88,6 @@ template class BitField { #define BEEP_MIN_FREQ (150) #define BEEP_MAX_FREQ (15000) #define BEEP_DEFAULT_FREQ (2250) -#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+150) -#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-150) #if defined(AUDIO_DUAL_BUFFER) enum AudioBufferState @@ -655,4 +656,4 @@ void referenceModelAudioFiles(); bool isAudioFileReferenced(uint32_t i, char * filename/*at least AUDIO_FILENAME_MAXLEN+1 long*/); -#endif // _AUDIO_ARM_H_ +#endif // _AUDIO_H_ diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index d9d24dff9..efb33334e 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -48,17 +48,18 @@ Bluetooth bluetooth; void Bluetooth::write(const uint8_t * data, uint8_t length) { - BLUETOOTH_TRACE("BT>"); - for (int i=0; i"); + for (int i = 0; i < length; i++) { + BLUETOOTH_TRACE(" %02X", data[i]); + btTxFifo.push(data[i]); } - btTxFifo.push(data[i]); + BLUETOOTH_TRACE(CRLF); } - BLUETOOTH_TRACE(CRLF); + else { + BLUETOOTH_TRACE("[BT] TX fifo full!" CRLF); + } + bluetoothWriteWakeup(); } @@ -175,7 +176,7 @@ void Bluetooth::processTrainerByte(uint8_t data) switch (dataState) { case STATE_DATA_START: if (data == START_STOP) { - dataState = STATE_DATA_IN_FRAME ; + dataState = STATE_DATA_IN_FRAME; bufferIndex = 0; } else { @@ -188,7 +189,7 @@ void Bluetooth::processTrainerByte(uint8_t data) dataState = STATE_DATA_XOR; // XOR next byte } else if (data == START_STOP) { - dataState = STATE_DATA_IN_FRAME ; + dataState = STATE_DATA_IN_FRAME; bufferIndex = 0; } else { diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 671b4797f..e6801d34c 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -384,20 +384,7 @@ PACK(struct TelemetrySensor { bool isPrecConfigurable() const; int32_t getPrecMultiplier() const; int32_t getPrecDivisor() const; - bool isSameInstance(TelemetryProtocol protocol, uint8_t instance) - { - if (this->instance == instance) - return true; - - if (protocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { - if (((this->instance ^ instance) & 0x9F) == 0 && (this->instance >> 5) != TELEMETRY_ENDPOINT_SPORT && (instance >> 5) != TELEMETRY_ENDPOINT_SPORT) { - this->instance = instance; // update the instance in case we had telemetry switching - return true; - } - } - - return false; - } + bool isSameInstance(TelemetryProtocol protocol, uint8_t instance); ); }); @@ -501,11 +488,11 @@ PACK(struct ModuleData { // Helper functions to set both of the rfProto protocol at the same time NOBACKUP(inline uint8_t getMultiProtocol() { - return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); + return ((uint8_t) (rfProtocol & 0x0F)) + (multi.rfProtocolExtra << 4); }) NOBACKUP(inline void setMultiProtocol(uint8_t proto) { - rfProtocol = (uint8_t) (proto & 0x0f); + rfProtocol = (uint8_t) (proto & 0x0F); multi.rfProtocolExtra = (proto & 0x70) >> 4; }) }); diff --git a/radio/src/fifo.h b/radio/src/fifo.h index 9aff60f57..8ef67be66 100644 --- a/radio/src/fifo.h +++ b/radio/src/fifo.h @@ -71,7 +71,7 @@ class Fifo return (ridx == widx); } - bool isFull() + bool isFull() const { uint32_t next = nextIndex(widx); return (next == ridx); @@ -82,7 +82,7 @@ class Fifo return (N + widx - ridx) & (N - 1); } - uint32_t hasSpace(uint32_t n) const + bool hasSpace(uint32_t n) const { return (N > (size() + n)); } @@ -103,7 +103,7 @@ class Fifo volatile uint32_t widx; volatile uint32_t ridx; - inline uint32_t nextIndex(uint32_t idx) + static inline uint32_t nextIndex(uint32_t idx) { return (idx + 1) & (N - 1); } diff --git a/radio/src/fonts/480x272/CMakeLists.txt b/radio/src/fonts/480x272/CMakeLists.txt new file mode 100644 index 000000000..a8b57384e --- /dev/null +++ b/radio/src/fonts/480x272/CMakeLists.txt @@ -0,0 +1,21 @@ +set(FONT "Roboto/Roboto-Regular") +set(FONT_BOLD "Roboto/Roboto-Bold") +set(FONT_OFFSET 1) + +#set(FONT "Kanit/Kanit-Regular") +#set(FONT_BOLD "Kanit/Kanit-Bold") +#set(FONT_OFFSET -2) + +#set(FONT "Ubuntu/Ubuntu-Regular") +#set(FONT_BOLD "Ubuntu/Ubuntu-Bold") +#set(FONT_OFFSET 1) + +add_truetype_font_target(480x272 tinsize ${FONT} 9 0) +add_truetype_font_target(480x272 smlsize ${FONT} 13 0) +add_truetype_font_target(480x272 stdsize ${FONT} 16 1) +add_truetype_font_target(480x272 stdsizebold ${FONT_BOLD} 16 1) +add_truetype_font_target(480x272 midsize ${FONT} 24 0) +add_truetype_font_target(480x272 dblsize ${FONT_BOLD} 32 0) +add_truetype_font_target(480x272 xxlsize ${FONT_BOLD} 64 0) + +add_custom_target(ttf_horus_fonts DEPENDS ${ttf_480x272_fonts_targets}) diff --git a/radio/src/fonts/480x272/font_stdsize.png b/radio/src/fonts/480x272/font_stdsize.png new file mode 100644 index 000000000..afd1e98b5 Binary files /dev/null and b/radio/src/fonts/480x272/font_stdsize.png differ diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index d3e8d5e47..db3c29c33 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -117,7 +117,6 @@ void lcdPutPattern(coord_t x, coord_t y, const uint8_t * pattern, uint8_t width, } } -#if !defined(BOOT) struct PatternData { uint8_t width; @@ -144,10 +143,11 @@ uint8_t getPatternWidth(const PatternData * pattern) void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags) { +#if !defined(BOOT) uint32_t fontsize = FONTSIZE(flags); unsigned char c_remapped = 0; - if (fontsize == DBLSIZE || (flags&BOLD)) { + if (fontsize == DBLSIZE || (flags & BOLD)) { // To save space only some DBLSIZE and BOLD chars are available // c has to be remapped. All non existing chars mapped to 0 (space) if (c>=',' && c<=':') @@ -204,6 +204,11 @@ void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags) pattern->height = 7; pattern->data = (c < 0xC0) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0xC0)*5]; } +#else + pattern->width = 5; + pattern->height = 7; + pattern->data = &font_5x7[(c-0x20)*5]; +#endif } uint8_t getCharWidth(char c, LcdFlags flags) @@ -212,7 +217,6 @@ uint8_t getCharWidth(char c, LcdFlags flags) getCharPattern(&pattern, c, flags); return getPatternWidth(&pattern); } -#endif void lcdDrawChar(coord_t x, coord_t y, char c, LcdFlags flags) { @@ -287,12 +291,15 @@ void lcdDrawChar(coord_t x, coord_t y, char c) lcdDrawChar(x, y, c, 0); } -#if !defined(BOOT) uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) { uint8_t width = 0; - for (int i=0; len==0 || ifunc) s_currIdx = sub; - POPUP_MENU_ADD_ITEM(STR_EDIT); + if (sub >= 0) + POPUP_MENU_ADD_ITEM(STR_EDIT); if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_COPY); if (clipboard.type == CLIPBOARD_TYPE_CUSTOM_SWITCH) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4a06f741b..94252ffbc 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -119,8 +119,6 @@ enum MenuModelSetupItems { #if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE, -#endif -#if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif @@ -163,8 +161,6 @@ enum MenuModelSetupItems { }; #define MODEL_SETUP_2ND_COLUMN (LCD_W-11*FW) -#define MODEL_SETUP_BIND_OFS 2*FW+1 -#define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 #define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW) @@ -316,7 +312,7 @@ void onBluetoothConnectMenu(const char * result) MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \ MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \ - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(MODULE_BIND_ROWS(INTERNAL_MODULE)))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, MODULE_BIND_ROWS(INTERNAL_MODULE)), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \ MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \ MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \ @@ -409,18 +405,19 @@ void menuModelSetup(event_t event) NUM_STICKS+NUM_POTS+NUM_SLIDERS-1, // Center beeps 0, // Global functions - LABEL(ExternalModule), + LABEL(ExternalModule), MODULE_TYPE_ROWS(EXTERNAL_MODULE), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum + 0, // Output type (OpenDrain / PushPull) MODULE_POWER_ROW(EXTERNAL_MODULE), IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) FAILSAFE_ROWS(EXTERNAL_MODULE), - IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 1 IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2 @@ -590,7 +587,7 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_THROTTLE_REVERSED: - g_model.throttleReversed = editCheckBox(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ; + g_model.throttleReversed = editCheckBox(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ); break; case ITEM_MODEL_SETUP_THROTTLE_TRACE: @@ -736,24 +733,24 @@ void menuModelSetup(event_t event) } } - for (uint8_t i=0; i>= 2; + c = '0' + (states & 0x03); + states >>= 2u; } else { if ((states & 0x01) && swactive) - attr = INVERS; + swattr = INVERS; c = *(STR_VSWITCHES - 2 + 9 + (3*(i+1))); - states >>= 1; + states >>= 1u; } if (attr && (menuHorizontalPosition == i)) { - attr = BLINK | INVERS; + swattr = BLINK | INVERS; } - lcdDrawChar(MODEL_SETUP_2ND_COLUMN+i*FW, y, (swactive) ? c : '-', attr); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+i*FW, y, swactive ? c : '-', swattr); lcdDrawText(MODEL_SETUP_2ND_COLUMN+(NUM_SWITCHES*FW), y, "<]", (menuHorizontalPosition == NUM_SWITCHES-1 && !NO_HIGHLIGHT()) ? attr : 0); } #endif @@ -811,10 +808,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_BEEP_CENTER: lcdDrawTextAlignedLeft(y, STR_BEEPCTR); - for (uint8_t i=0; i0) { + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -33, 35); @@ -1319,19 +1314,17 @@ void menuModelSetup(event_t event) } } else { + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); horzpos_t l_posHorz = menuHorizontalPosition; - coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; - if (!isModuleRxNumAvailable(moduleIdx)) { - xOffsetBind = 0; - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); - if (attr) l_posHorz += 1; + coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN; + if (isModuleRxNumAvailable(moduleIdx)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + bindButtonPos = lcdNextPos + 2; } - else { - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); + else if (attr) { + l_posHorz += 1; } if (isModuleBindRangeAvailable(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) { if (s_editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); @@ -1348,9 +1341,10 @@ void menuModelSetup(event_t event) } } } - lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - if (!IS_RX_MULTI(moduleIdx)) - lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz == 1 ? attr : 0); + if (isModuleRangeAvailable(moduleIdx)) { + lcdDrawText(lcdNextPos + 2, y, STR_MODULE_RANGE, l_posHorz == 2 ? attr : 0); + } uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1393,7 +1387,7 @@ void menuModelSetup(event_t event) } } #else - if (attr && l_posHorz>0 && s_editMode>0) { + if (attr && l_posHorz > 0 && s_editMode > 0) { if (l_posHorz == 1) newFlag = MODULE_MODE_BIND; else if (l_posHorz == 2) @@ -1425,7 +1419,8 @@ void menuModelSetup(event_t event) #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE: #endif - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: { + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: + { ModuleData &moduleData = g_model.moduleData[moduleIdx]; lcdDrawTextAlignedLeft(y, STR_FAILSAFE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 ? attr : 0); diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index bfcee26c3..2eaad8f2b 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -147,7 +147,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF #if defined(PCBTARANIS) #if defined(PCBXLITE) - // ENT LONG on xlite brings up switch type menu, so this menu is activated with SHIT + ENT LONG + // ENT LONG on xlite brings up switch type menu, so this menu is activated with SHIFT + ENT LONG if (menuHorizontalPosition==0 && event==EVT_KEY_LONG(KEY_ENTER) && IS_SHIFT_PRESSED() && !READ_ONLY()) { #else if (menuHorizontalPosition<0 && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) { diff --git a/radio/src/gui/128x64/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index e13e091d3..304ddc8bb 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -24,7 +24,7 @@ enum SensorFields { SENSOR_FIELD_NAME, SENSOR_FIELD_TYPE, SENSOR_FIELD_ID, - SENSOR_FIELD_FORMULA=SENSOR_FIELD_ID, + SENSOR_FIELD_FORMULA = SENSOR_FIELD_ID, SENSOR_FILED_RECEIVER_NAME, SENSOR_FIELD_UNIT, SENSOR_FIELD_PRECISION, diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index fdeca7cc9..7d8fdb981 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -153,9 +153,9 @@ void lcdPutPattern(coord_t x, coord_t y, const uint8_t * pattern, uint8_t width, } } -#if !defined(BOOT) void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags) { +#if !defined(BOOT) uint32_t fontsize = FONTSIZE(flags); unsigned char c_remapped = 0; @@ -216,6 +216,11 @@ void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags) pattern->height = 7; pattern->data = (c < 0x80) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0x80)*5]; } +#else + pattern->width = 5; + pattern->height = 7; + pattern->data = &font_5x7[(c-0x20) * 5]; +#endif } uint8_t getCharWidth(char c, LcdFlags flags) @@ -224,7 +229,6 @@ uint8_t getCharWidth(char c, LcdFlags flags) getCharPattern(&pattern, c, flags); return getPatternWidth(&pattern); } -#endif void lcdDrawChar(coord_t x, coord_t y, char c, LcdFlags flags) { @@ -244,12 +248,15 @@ void lcdDrawChar(coord_t x, coord_t y, char c) lcdDrawChar(x, y, c, 0); } -#if !defined(BOOT) uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) { uint8_t width = 0; - for (int i=0; len==0 || i0) { + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -20, 35); @@ -1117,9 +1116,8 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_REFRESHRATE); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS); - lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, moduleData.sbus.noninverted ? "not inverted" : "normal", (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); - - if (attr && s_editMode>0) { + lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, moduleData.sbus.noninverted ? STR_NOT_INVERTED : STR_NORMAL, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -33, 35); @@ -1131,25 +1129,19 @@ void menuModelSetup(event_t event) } } else { + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); horzpos_t l_posHorz = menuHorizontalPosition; coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN; - if (!isModuleRxNumAvailable(moduleIdx)) { - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); - if (attr) l_posHorz += 1; + if (isModuleRxNumAvailable(moduleIdx)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2); + bindButtonPos = lcdNextPos + FW; } - else { - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); + else if (attr) { + l_posHorz += 1; } if (isModuleBindRangeAvailable(moduleIdx)) { - if (!IS_RX_MULTI(moduleIdx)) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2); - bindButtonPos = lcdNextPos + FW; - } - else { - bindButtonPos = MODEL_SETUP_2ND_COLUMN; - } - if (attr && l_posHorz==0) { - if (s_editMode>0) { + if (attr && l_posHorz == 0) { + if (s_editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; @@ -1164,9 +1156,10 @@ void menuModelSetup(event_t event) } } } - lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - if (!IS_RX_MULTI(moduleIdx)) - lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz == 1 ? attr : 0); + if (isModuleRangeAvailable(moduleIdx)) { + lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz == 2 ? attr : 0); + } uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1174,8 +1167,8 @@ void menuModelSetup(event_t event) s_editMode = 0; } #endif - if (attr && l_posHorz>0) { - if (s_editMode>0) { + if (attr && l_posHorz > 0) { + if (s_editMode > 0) { if (l_posHorz == 1) { if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { @@ -1202,8 +1195,9 @@ void menuModelSetup(event_t event) } moduleState[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (newFlag == MODULE_MODE_BIND) + if (newFlag == MODULE_MODE_BIND) { setMultiBindStatus(moduleIdx, MULTI_BIND_INITIATED); + } #endif } } @@ -1453,12 +1447,12 @@ void menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { switch(menuVerticalPosition) { - case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); break; - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); break; diff --git a/radio/src/gui/colorlcd/model_select_old.cpp b/radio/src/gui/colorlcd/model_select_old.cpp index abb12ce68..0b70b2966 100644 --- a/radio/src/gui/colorlcd/model_select_old.cpp +++ b/radio/src/gui/colorlcd/model_select_old.cpp @@ -99,7 +99,6 @@ void setCurrentCategory(unsigned int index) } #if defined(LUA) - #define MAX_WIZARD_NAME_LEN (sizeof(WIZARD_PATH)+20) #define WIZARD_SPACING 40 #define WIZARD_LEFT_SPACING 30 @@ -248,6 +247,7 @@ void onModelSelectMenu(const char * result) storageCheck(true); memcpy(g_eeGeneral.currModelFilename, currentModel->modelFilename, LEN_MODEL_FILENAME); modelslist.setCurrentModel(currentModel); + modelslist.setCurrentCategory(currentCategory); loadModel(g_eeGeneral.currModelFilename, true); storageDirty(EE_GENERAL); storageCheck(true); @@ -264,6 +264,7 @@ void onModelSelectMenu(const char * result) selectMode = MODE_SELECT_MODEL; setCurrentModel(currentCategory->size() - 1); modelslist.setCurrentModel(currentModel); + modelslist.setCurrentCategory(currentCategory); modelslist.onNewModelCreated(currentModel, &g_model); #if defined(LUA) chainMenu(menuModelWizard); @@ -274,7 +275,7 @@ void onModelSelectMenu(const char * result) memcpy(duplicatedFilename, currentModel->modelFilename, sizeof(duplicatedFilename)); if (findNextFileIndex(duplicatedFilename, LEN_MODEL_FILENAME, MODELS_PATH)) { sdCopyFile(currentModel->modelFilename, MODELS_PATH, duplicatedFilename, MODELS_PATH); - ModelCell* dup_model = modelslist.addModel(currentCategory, duplicatedFilename); + ModelCell * dup_model = modelslist.addModel(currentCategory, duplicatedFilename); dup_model->fetchRfData(); setCurrentModel(currentCategory->size() - 1); } @@ -344,7 +345,7 @@ void initModelsList() bool menuModelSelect(event_t event) { const std::list& cats = modelslist.getCategories(); - switch(event) { + switch (event) { case 0: // no need to refresh the screen return false; @@ -387,7 +388,7 @@ bool menuModelSelect(event_t event) categoriesVerticalPosition -= 1; setCurrentCategory(categoriesVerticalPosition); modelslist.moveModel(model, previous_category, currentCategory); - setCurrentModel(currentCategory->size()-1); + setCurrentModel(currentCategory->size() - 1); } killEvents(event); break; diff --git a/radio/src/gui/colorlcd/widgets/modelbmp.cpp b/radio/src/gui/colorlcd/widgets/modelbmp.cpp index e685b3ba9..71605a858 100644 --- a/radio/src/gui/colorlcd/widgets/modelbmp.cpp +++ b/radio/src/gui/colorlcd/widgets/modelbmp.cpp @@ -63,7 +63,7 @@ class ModelBitmapWidget: public Widget } } - virtual void refresh() + void refresh() override { uint32_t new_hash = hash(g_model.header.bitmap, sizeof(g_model.header.bitmap)); new_hash ^= hash(g_model.header.name, sizeof(g_model.header.name)); diff --git a/radio/src/gui/colorlcd/widgets/outputs.cpp b/radio/src/gui/colorlcd/widgets/outputs.cpp index d950c4618..e0f8bb523 100644 --- a/radio/src/gui/colorlcd/widgets/outputs.cpp +++ b/radio/src/gui/colorlcd/widgets/outputs.cpp @@ -33,7 +33,7 @@ class OutputsWidget: public Widget { } - virtual void refresh(); + void refresh() override; uint8_t drawChannels(const uint16_t & x, const uint16_t & y, const uint16_t & w, const uint16_t & h, const uint8_t & firstChan, const bool & bg_shown, const uint16_t & bg_color) { diff --git a/radio/src/gui/colorlcd/widgets/text.cpp b/radio/src/gui/colorlcd/widgets/text.cpp index 5376064ca..4195e503d 100644 --- a/radio/src/gui/colorlcd/widgets/text.cpp +++ b/radio/src/gui/colorlcd/widgets/text.cpp @@ -30,7 +30,7 @@ class TextWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; diff --git a/radio/src/gui/colorlcd/widgets/timer.cpp b/radio/src/gui/colorlcd/widgets/timer.cpp index b603c9c18..2a42b0938 100644 --- a/radio/src/gui/colorlcd/widgets/timer.cpp +++ b/radio/src/gui/colorlcd/widgets/timer.cpp @@ -28,7 +28,7 @@ class TimerWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; diff --git a/radio/src/gui/colorlcd/widgets/value.cpp b/radio/src/gui/colorlcd/widgets/value.cpp index b0c8c5b52..4bfab133e 100644 --- a/radio/src/gui/colorlcd/widgets/value.cpp +++ b/radio/src/gui/colorlcd/widgets/value.cpp @@ -28,7 +28,7 @@ class ValueWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index a00fb46b8..b2dd513ba 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -26,7 +26,7 @@ uint8_t getExposCount() { uint8_t count = 0; - uint8_t ch ; + uint8_t ch; for (int i=MAX_EXPOS-1 ; i>=0; i--) { ch = EXPO_VALID(expoAddress(i)); diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index c2714a3b0..d5324e509 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -26,7 +26,7 @@ uint8_t getMixesCount() { uint8_t count = 0; - uint8_t ch ; + uint8_t ch; for (int i=MAX_MIXERS-1; i>=0; i--) { ch = mixAddress(i)->srcRaw; diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp index 13ad0437c..063c50cb9 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp @@ -80,5 +80,6 @@ void startBindMenu(uint8_t moduleIdx) selection += 1; POPUP_MENU_SELECT_ITEM(selection); + POPUP_MENU_TITLE(STR_SELECT_MODE); POPUP_MENU_START(onBindMenu); } diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp index 2d97f44dc..13ee54942 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp @@ -304,7 +304,7 @@ void modelSetupModulePxx2ReceiverLine(uint8_t moduleIdx, uint8_t receiverIdx, co for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[rx]; } - popupMenuTitle = STR_PXX2_SELECT_RX; + POPUP_MENU_TITLE(STR_PXX2_SELECT_RX); POPUP_MENU_START(onPXX2BindMenu); } } diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h index 4b3b54823..b158793c8 100644 --- a/radio/src/gui/common/stdlcd/popups.h +++ b/radio/src/gui/common/stdlcd/popups.h @@ -83,6 +83,7 @@ enum { warningText = nullptr; warningInfoText = nullptr; + popupMenuTitle = nullptr; popupMenuHandler = nullptr; popupMenuItemsCount = 0; } @@ -171,6 +172,11 @@ inline void POPUP_MENU_SELECT_ITEM(uint8_t index) popupMenuSelectedItem = (index > 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount) : 0); } +inline void POPUP_MENU_TITLE(const char * s) +{ + popupMenuTitle = s; +} + inline void POPUP_MENU_START(PopupMenuHandler handler) { if (handler != popupMenuHandler) { diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index ffbede8e0..80c2f7207 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -585,7 +585,7 @@ void menuRadioSdManager(event_t _event) for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; } - popupMenuTitle = STR_PXX2_SELECT_RX; + POPUP_MENU_TITLE(STR_PXX2_SELECT_RX); POPUP_MENU_START(onUpdateReceiverSelection); } } diff --git a/radio/src/gui/common/stdlcd/radio_trainer.cpp b/radio/src/gui/common/stdlcd/radio_trainer.cpp index 58c338a8d..c14e27604 100644 --- a/radio/src/gui/common/stdlcd/radio_trainer.cpp +++ b/radio/src/gui/common/stdlcd/radio_trainer.cpp @@ -21,9 +21,9 @@ #include "opentx.h" #if LCD_W >= 212 - #define TRAINER_CALIB_COLUMN_WIDTH 12 + #define TRAINER_CALIB_COLUMN_WIDTH (6 * FW) #else - #define TRAINER_CALIB_COLUMN_WIDTH 8 + #define TRAINER_CALIB_COLUMN_WIDTH (4 * FW + 2) #endif void menuRadioTrainer(event_t event) @@ -86,8 +86,8 @@ void menuRadioTrainer(event_t event) if (attr) s_editMode = 0; lcdDrawText(0*FW, MENU_HEADER_HEIGHT+1+6*FH, STR_CAL, attr); - for (uint8_t i=0; i<4; i++) { - uint8_t x = (i*TRAINER_CALIB_COLUMN_WIDTH + 16) * FW/2; + for (uint8_t i = 0; i < 4; i++) { + uint8_t x = 8*FW + (i * TRAINER_CALIB_COLUMN_WIDTH); int32_t chVal = ppmInput[i] - g_eeGeneral.trainer.calib[i]; chVal *= g_eeGeneral.trainer.mix[i].studWeight * 10; chVal /= 512; diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 62bbd952d..11165f611 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -883,7 +883,7 @@ const char STR_SUBTYPE_SYMAX[] = "\003""Std""X5C"; const char STR_SUBTYPE_SLT[] = "\006""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0"; const char STR_SUBTYPE_CX10[] = "\007""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041"; const char STR_SUBTYPE_CG023[] = "\005""Std\0 ""YD829"; -const char STR_SUBTYPE_BAYANG[] = "\007""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4"; +const char STR_SUBTYPE_BAYANG[] = "\007""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 "; const char STR_SUBTYPE_ESky[] = "\003""Std""ET4"; const char STR_SUBTYPE_MT99[] = "\006""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805"; const char STR_SUBTYPE_MJXQ[] = "\007""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; @@ -909,7 +909,9 @@ const char STR_SUBTYPE_POTENSIC[] = "\003""A20"; const char STR_SUBTYPE_ZSX[] = "\007""280JJRC"; const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410"; const char STR_SUBTYPE_FRSKYX_RX[] = "\007""RX\0 ""CloneTX"; +const char STR_SUBTYPE_HOTT[] = "\007""Sync\0 ""No_Sync"; const char STR_SUBTYPE_FX816[] = "\003""P38"; +const char STR_SUBTYPE_PELIKAN[] = "\004""Pro\0""Lite"; const char STR_SUBTYPE_XK[] = "\004""X450""X420"; const char STR_SUBTYPE_XN297DUMP[] = "\004""250K""1M\0 ""2M\0 ""AUTO"; const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned"; @@ -945,7 +947,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr}, {MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr}, - {MODULE_SUBTYPE_MULTI_BAYANG, 4, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, {MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr}, {MODULE_SUBTYPE_MULTI_MT99XX, 4, false, false, STR_SUBTYPE_MT99, nullptr}, {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, STR_MULTI_RFTUNE}, @@ -975,8 +977,9 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_ZSX, 0, false, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, false, STR_SUBTYPE_FLYZONE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HOTT, 1, true, false, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_PELIKAN, 1, false, false, STR_SUBTYPE_PELIKAN, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, @@ -985,6 +988,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, true, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_Q90C, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 597dd5ce7..493d08339 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -147,27 +147,44 @@ void drawCurve(coord_t offset=0); inline uint8_t MODULE_BIND_ROWS(int moduleIdx) { - if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || IS_RX_MULTI(moduleIdx)) + if (isModuleMultimodule(moduleIdx)) { + if (IS_RX_MULTI(moduleIdx)) + return 1; + else + return 2; + } + else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx)) { return 1; - - if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx)) + } + else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) { return 2; - else + } + else { return HIDDEN_ROW; + } } inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx) { - if (!IS_MODULE_ENABLED(moduleIdx) || IS_RX_MULTI(moduleIdx)) + if (!IS_MODULE_ENABLED(moduleIdx)) { return HIDDEN_ROW; - - if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx) || (isModuleMultimodule(moduleIdx) && g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2)) + } + else if (isModuleMultimodule(moduleIdx)) { + if (IS_RX_MULTI(moduleIdx)) + return HIDDEN_ROW; + else if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) + return 1; + else + return 0; + } + else if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx)) { return 0; - else + } + else { return 1; + } } - #if defined(MULTIMODULE) inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) { @@ -270,7 +287,9 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #else #define MULTIMODULE_STATUS_ROWS(moduleIdx) #define MULTIMODULE_MODULE_ROWS(moduleIdx) +#define MULTIMODULE_TYPE_ROW(moduleIdx) #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) +#define MULTIMODULE_TYPE_ROWS(moduleIdx) #define MULTIMODULE_MODE_ROWS(moduleIdx) (uint8_t)0 #define MULTIMODULE_OPTIONS_ROW(moduleIdx) HIDDEN_ROW #define MODULE_POWER_ROW(moduleIdx) isModuleR9MNonAccess(moduleIdx) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index b3120d5bd..271a6ffaf 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -265,7 +265,7 @@ class LuaWidget: public Widget virtual void update(); - virtual void refresh(); + void refresh() override; virtual void background(); diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 07d210979..d17c4d0a7 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -72,6 +72,7 @@ void openUsbMenu() #if defined(DEBUG) POPUP_MENU_ADD_ITEM(STR_USB_SERIAL); #endif + POPUP_MENU_TITLE(STR_SELECT_MODE); POPUP_MENU_START(onUSBConnectMenu); } #endif diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 85e9c4b96..61be1aeef 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -939,7 +939,7 @@ void evalMixes(uint8_t tick10ms) mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); for (uint8_t i=0; i> 4) * fp_act[p]; + sum_chans512[i] += limit(-0x6fff, chans[i] >> 4, 0x6fff) * fp_act[p]; weight += fp_act[p]; } } @@ -1003,5 +1003,4 @@ void evalMixes(uint8_t tick10ms) } } } - } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9f40813bc..603a5cd27 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -771,7 +771,7 @@ void doSplash() } #endif -#if defined(FRSKY_RELEASE) +#if defined(FRSKY_RELEASE) && !defined(COLORLCD) static uint8_t secondSplash = false; if (!secondSplash && get_tmr10ms() >= tgtime-200) { secondSplash = true; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c328ac390..b6d870889 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -698,7 +698,7 @@ extern const char vers_stamp[]; * @param buffer If non-null find the firmware version in the buffer instead * @return The opentx version string starting with "opentx-" or "no version found" if the version string is not found */ -const char * getOtherVersion(char * buffer); +const char * getFirmwareVersion(const char * buffer = nullptr); #define g_blinkTmr10ms (*(uint8_t*)&g_tmr10ms) diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 32f7fe4cc..313e034bd 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -167,11 +167,12 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_FRSKY_R9, MODULE_SUBTYPE_MULTI_PROPEL, MODULE_SUBTYPE_MULTI_FRSKYL, - MODULE_SUBTYPE_MULTI_SKYARTEC, + MODULE_SUBTYPE_MULTI_SKYARTEC, //65 MODULE_SUBTYPE_MULTI_ESKY150V2, MODULE_SUBTYPE_MULTI_DSM_RX, MODULE_SUBTYPE_MULTI_JJRC345, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_JJRC345 + MODULE_SUBTYPE_MULTI_Q90C, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_Q90C }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 71d135078..9491d88af 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -474,6 +474,11 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx) return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx); } +inline bool isModuleRangeAvailable(uint8_t moduleIdx) +{ + return isModuleBindRangeAvailable(moduleIdx) && !IS_RX_MULTI(moduleIdx); +} + constexpr uint8_t MAX_RXNUM = 63; inline uint8_t getMaxRxNum(uint8_t idx) diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index 9fe10113c..cfcff15d0 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -393,7 +393,7 @@ void sendSport(uint8_t moduleIdx) void sendHott(uint8_t moduleIdx) { - if (Multi_Buffer && memcmp(Multi_Buffer, "HoTT", 4) == 0 && Multi_Buffer[5] >= 0xD7 && Multi_Buffer[5] <= 0xDF) { + if (Multi_Buffer && memcmp(Multi_Buffer, "HoTT", 4) == 0 && (Multi_Buffer[5] & 0x80) && (Multi_Buffer[5] & 0x0F) >= 0x07) { // HoTT Lua script is running sendMulti(moduleIdx, Multi_Buffer[5]); } diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index afcbaa061..f0e48f4b6 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -319,6 +319,13 @@ static void enablePulsesInternalModule(uint8_t protocol) intmoduleTimerStart(MULTIMODULE_PERIOD); break; #endif + +#if defined(INTERNAL_MODULE_PPM) + case PROTOCOL_CHANNELS_PPM: + intmodulePpmStart(); + break; +#endif + default: break; } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 0f7cfc504..e2db4783e 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -352,6 +352,7 @@ void sendByteDsm2(uint8_t b); void putDsm2Flush(); void putDsm2SerialBit(uint8_t bit); void sendByteSbus(uint8_t b); +void intmodulePpmStart(); void intmodulePxx1PulsesStart(); void intmodulePxx1SerialStart(); void extmodulePxx1PulsesStart(); @@ -359,6 +360,7 @@ void extmodulePxx1SerialStart(); void extmodulePpmStart(); void intmoduleStop(); void extmoduleStop(); +void extramodulePpmStart(); inline void startPulses() { diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index 2583de31f..915fb7afb 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -29,26 +29,26 @@ #define TAB "\037\033" #if defined(FRSKY_RELEASE) -#define DISPLAY_VERSION "FrSky" +#define DISPLAY_VERSION "-frsky" #elif defined(JUMPER_RELEASE) -#define DISPLAY_VERSION "JumperRC" +#define DISPLAY_VERSION "-jumper" #elif defined(RADIOMASTER_RELEASE) -#define DISPLAY_VERSION "Radiomaster" +#define DISPLAY_VERSION "-radiomaster" #elif defined(TBS_RELEASE) -#define DISPLAY_VERSION "TBS" +#define DISPLAY_VERSION "-tbs" #else -#define DISPLAY_VERSION VERSION +#define DISPLAY_VERSION #endif #if defined(COLORLCD) - const char vers_stamp[] = "opentx-" FLAVOUR "-" DISPLAY_VERSION " (" GIT_STR ")"; - const char date_stamp[] = DATE; - const char time_stamp[] = TIME; - const char eeprom_stamp[] = EEPROM_STR; + const char vers_stamp[] = "VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")"; + const char date_stamp[] = "DATE" TAB ": " DATE; + const char time_stamp[] = "TIME" TAB ": " TIME; + const char eeprom_stamp[] = "EEPR" TAB ": " EEPROM_STR; #elif defined(BOARD_NAME) - const char vers_stamp[] = "FW" TAB ": opentx-" BOARD_NAME "\036VERS" TAB ": " DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; + const char vers_stamp[] = "FW" TAB ": opentx-" BOARD_NAME "\036VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; #else - const char vers_stamp[] = "FW" TAB ": opentx-" FLAVOUR "\036VERS" TAB ": " DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; + const char vers_stamp[] = "FW" TAB ": opentx-" FLAVOUR "\036VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; #endif /** @@ -56,35 +56,29 @@ * @return */ #if defined(STM32) && !defined(SIMU) - -__SECTION_USED(".fwversiondata") const char firmware_version[] = "opentx-" FLAVOUR "-" DISPLAY_VERSION " (" GIT_STR ")"; -__SECTION_USED(".bootversiondata") const char boot_version[] = "opentx-" FLAVOUR "-" DISPLAY_VERSION " (" GIT_STR ")"; +__SECTION_USED(".fwversiondata") const char firmware_version[] = "opentx-" FLAVOUR "-" VERSION DISPLAY_VERSION " (" GIT_STR ")"; +__SECTION_USED(".bootversiondata") const char boot_version[] = "opentx-" FLAVOUR "-" VERSION DISPLAY_VERSION " (" GIT_STR ")"; /** * Tries to find opentx version in the first 1024 byte of either firmware/bootloader (the one not running) or the buffer * @param buffer If non-null find the firmware version in the buffer instead */ -const char * getOtherVersion(char* buffer) +const char * getFirmwareVersion(const char * buffer) { + if (buffer == nullptr) { #if defined(BOOT) - const char * startother = (char*)(FIRMWARE_ADDRESS+BOOTLOADER_SIZE); + buffer = (const char *)(FIRMWARE_ADDRESS + BOOTLOADER_SIZE); #else - const char * startother = (char*)(FIRMWARE_ADDRESS); + buffer = (const char *)FIRMWARE_ADDRESS; #endif - if (buffer != nullptr) - startother = buffer; + } - const char * other_str = nullptr; - for (int i=0; i<1024;i++) { - if (memcmp(startother+i, "opentx-", 7) == 0) { - other_str = startother + i; - break; + for (int i = 0; i < 1024; i++) { + if (memcmp(buffer + i, "opentx-", 7) == 0) { + return buffer + i; } } - if (other_str != nullptr) - return other_str; - else - return "no version found"; + return "no version found"; } #endif diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index ec8c109c2..892542b64 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -475,12 +475,12 @@ void ModelsList::save() f_close(&file); } -void ModelsList::setCurrentCategorie(ModelsCategory* cat) +void ModelsList::setCurrentCategory(ModelsCategory * cat) { currentCategory = cat; } -void ModelsList::setCurrentModel(ModelCell* cell) +void ModelsList::setCurrentModel(ModelCell * cell) { currentModel = cell; if (!currentModel->valid_rfData) diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 485c9cc17..85054c512 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -44,8 +44,8 @@ struct SimpleModuleData class ModelCell { public: - char modelFilename[LEN_MODEL_FILENAME+1]; - char modelName[LEN_MODEL_NAME+1] = {}; + char modelFilename[LEN_MODEL_FILENAME + 1]; + char modelName[LEN_MODEL_NAME + 1] = {}; bool valid_rfData; uint8_t modelId[NUM_MODULES]; @@ -55,11 +55,11 @@ class ModelCell explicit ModelCell(const char * name, uint8_t len); ~ModelCell(); - void save(FIL* file); + void save(FIL * file); - void setModelName(char* name); + void setModelName(char * name); void setModelName(char* name, uint8_t len); - void setRfData(ModelData* model); + void setRfData(ModelData * model); void setModelId(uint8_t moduleIdx, uint8_t id); void setRfModuleData(uint8_t moduleIdx, ModuleData* modData); @@ -72,7 +72,7 @@ class ModelCell class ModelsCategory: public std::list { public: - char name[LEN_MODEL_FILENAME+1]; + char name[LEN_MODEL_FILENAME + 1]; explicit ModelsCategory(const char * name); explicit ModelsCategory(const char * name, uint8_t len); @@ -114,7 +114,7 @@ public: return categories; } - void setCurrentCategorie(ModelsCategory * cat); + void setCurrentCategory(ModelsCategory * cat); ModelsCategory * getCurrentCategory() const { @@ -131,7 +131,7 @@ public: void incModelsCount() { modelsCount++; } - + unsigned int getModelsCount() const { return modelsCount; @@ -155,7 +155,6 @@ public: protected: FIL file; - }; extern ModelsList modelslist; diff --git a/radio/src/targets/common/arm/stm32/bootloader/bin_files.cpp b/radio/src/targets/common/arm/stm32/bootloader/bin_files.cpp index fc7c89202..49e27e33a 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/bin_files.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/bin_files.cpp @@ -117,10 +117,10 @@ FRESULT openBinFile(MemoryType mt, unsigned int index) void extractFirmwareVersion(VersionTag* tag) { - const char* vers = getOtherVersion((char*)Block_buffer); + const char * vers = getFirmwareVersion((const char *)Block_buffer); if (!vers || (vers[0] == 'n' && vers[1] == 'o')) { // "no version found" - memcpy(tag->flavour, "unknown", sizeof("unknown")); - tag->version = "unknown"; + memcpy(tag->flavour, "unknown", sizeof("unknown")); + tag->version = "unknown"; } // skip "opentx-" diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index 4e74cda70..3492804f1 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -210,21 +210,6 @@ int main() pwrInit(); keysInit(); - // USB charger handling -#if defined(USB_CHARGER) - if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() && !pwrPressed()) { - ledInit(); - usbChargerInit(); - ledOff(); - while (!pwrPressed()) { - if(usbChargerLed()) - GPIO_SetBits(LED_GPIO, LED_GREEN_GPIO_PIN); - else - ledOff(); - } - } -#endif - // wait a bit for the inputs to stabilize... if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { for (uint32_t i = 0; i < 150000; i++) { diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.h b/radio/src/targets/common/arm/stm32/bootloader/boot.h index 4f8e7edc7..c9e36269b 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.h +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.h @@ -24,7 +24,7 @@ #include "stamp.h" #if LCD_W < 212 - #define BOOTLOADER_TITLE " OTX Bootloader - " VERSION + #define BOOTLOADER_TITLE " Bootloader - " VERSION #else #define BOOTLOADER_TITLE " OpenTX Bootloader - " VERSION #endif @@ -34,12 +34,12 @@ #if LCD_W >= 480 #define STR_INVALID_FIRMWARE "Not a valid firmware file" #elif LCD_W >= 212 - #define STR_OR_PLUGIN_USB_CABLE INDENT "Or plug in a USB cable for mass storage" + #define STR_OR_PLUGIN_USB_CABLE "Or plug in a USB cable for mass storage" #define STR_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" #define STR_INVALID_FIRMWARE "\011Not a valid firmware file! " #define STR_INVALID_EEPROM "\011Not a valid EEPROM file! " #else - #define STR_OR_PLUGIN_USB_CABLE INDENT "Or plug in a USB cable" + #define STR_OR_PLUGIN_USB_CABLE "Or plug in a USB cable" #define STR_HOLD_ENTER_TO_START "\006Hold [ENT] to start" #define STR_INVALID_FIRMWARE "\004Not a valid firmware! " #define STR_INVALID_EEPROM "\004Not a valid EEPROM! " diff --git a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp index b60e5da8f..1fbfb970a 100644 --- a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp +++ b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp @@ -408,7 +408,7 @@ const FATDirEntry_t g_DIRroot[] = 0xA302, 0x3D55, 0x0002, - sizeof(firmware_txt) + strlen(getOtherVersion(nullptr)) + sizeof(firmware_txt) + strlen(getFirmwareVersion()) }, { { 'F', 'I', 'R', 'M', 'W', 'A', 'R', 'E'}, @@ -512,13 +512,11 @@ int32_t fat12Read(uint8_t * buffer, uint16_t sector, uint16_t count) else if (sector == 3) { memcpy(buffer, g_DIRroot, sizeof(g_DIRroot) ) ; } - else if (sector == 4) - { + else if (sector == 4) { memcpy(buffer, firmware_txt, sizeof(firmware_txt)); - memcpy(buffer + sizeof(firmware_txt), getOtherVersion(nullptr), strlen(getOtherVersion(nullptr))); + strcpy((char *)(buffer + sizeof(firmware_txt)), getFirmwareVersion()); } - else if (sector < RESERVED_SECTORS) - { + else if (sector < RESERVED_SECTORS) { // allocated to firmware.txt } else if (sector < RESERVED_SECTORS + (FLASHSIZE/BLOCK_SIZE )) { diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 85d05f25c..c107d152d 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -672,7 +672,7 @@ void gpsSendByte(uint8_t byte); // BT driver #define BT_TX_FIFO_SIZE 64 -#define BT_RX_FIFO_SIZE 128 +#define BT_RX_FIFO_SIZE 256 #define BLUETOOTH_BOOTLOADER_BAUDRATE 230400 #define BLUETOOTH_FACTORY_BAUDRATE 57600 #define BLUETOOTH_DEFAULT_BAUDRATE 115200 diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 6eba99d36..95064e298 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -74,22 +74,21 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) if (st == ST_START) { bootloaderDrawTitle(88, BOOTLOADER_TITLE); - + lcd->drawBitmapPattern(90, 72, LBM_FLASH, DEFAULT_COLOR); - lcd->drawText(124, 75, "Write Firmware"); + lcd->drawText(124, 75, "Write Firmware"); - lcd->drawBitmapPattern(90, 107, LBM_EXIT, DEFAULT_COLOR); - lcd->drawText(124, 110, "Exit"); + lcd->drawBitmapPattern(90, 107, LBM_EXIT, DEFAULT_COLOR); + lcd->drawText(124, 110, "Exit"); - lcd->drawSolidRect(119, (opt == 0) ? 72 : 107, 270, 26, 2, LINE_COLOR); - - lcd->drawBitmap(60, 166, &BMP_PLUG_USB); - lcd->drawText(195, 175, "Or plug in a USB cable"); - lcd->drawText(195, 200, "for mass storage"); + lcd->drawSolidRect(119, (opt == 0) ? 72 : 107, 270, 26, 2, LINE_COLOR); - bootloaderDrawFooter(); - lcd->drawText( 36, 242, "Current Firmware:"); - lcd->drawText(200, 242, getOtherVersion(nullptr)); + lcd->drawBitmap(60, 166, &BMP_PLUG_USB); + lcd->drawText(195, 175, "Or plug in a USB cable"); + lcd->drawText(195, 200, "for mass storage"); + + bootloaderDrawFooter(); + lcdDrawText(LCD_W / 2, 242, getFirmwareVersion(), CENTERED); } else if (st == ST_USB) { diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 0da9e46a5..7e8b90937 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -362,7 +362,7 @@ void extmoduleSendInvertedByte(uint8_t byte) // wait } time += 34; - for (i = 0 ; i < 8 ; i += 1) { + for (i = 0; i < 8; i++) { if (byte & 1) { GPIO_ResetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); } @@ -376,7 +376,7 @@ void extmoduleSendInvertedByte(uint8_t byte) time += 35 ; } GPIO_ResetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); - __enable_irq() ; // No need to wait for the stop bit to complete + __enable_irq(); // No need to wait for the stop bit to complete while ((uint16_t) (getTmr2MHz() - time) < 34) { // wait } diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index ca66b3e0c..265654e0e 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -51,7 +51,12 @@ inline void LCD_NRST_HIGH() LCD_GPIO_NRST->BSRRL = LCD_GPIO_PIN_NRST; } -static void LCD_AF_GPIOConfig(void) +inline bool coordsWithinScreen(coord_t x, coord_t y, coord_t w, coord_t h) +{ + return x >= 0 && y >= 0 && x + w <= LCD_W && y + h <= LCD_H; +} + +static void LCD_AF_GPIOConfig() { GPIO_InitTypeDef GPIO_InitStructure; @@ -362,6 +367,9 @@ void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, ui y = desth - (y + h); #endif + if (dest == displayBuf && !coordsWithinScreen(x, y, w, h)) + return; + DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; @@ -393,6 +401,9 @@ void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, srcy = srch - (srcy + h); #endif + if (dest == displayBuf && !coordsWithinScreen(x, y, w, h)) + return; + DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; @@ -433,6 +444,9 @@ void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_ srcy = srch - (srcy + h); #endif + if (dest == displayBuf && !coordsWithinScreen(x, y, w, h)) + return; + DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 6ce99257b..5e00921f2 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -23,11 +23,16 @@ #ifndef __GNUC__ #include +#include #define sleep(x) Sleep(x) #define strcasecmp _stricmp #define strncasecmp _tcsnicmp #define chdir _chdir #define getcwd _getcwd +inline int __builtin_clz(unsigned x) +{ + return (int)__lzcnt(x); +} #else #include #define sleep(x) usleep(1000*x) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index e64069aa8..77b2a719a 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -414,4 +414,7 @@ bool telemetrySecondPortReceive(uint8_t & data); extern const uint8_t BootCode[]; +// Pulses driver +#define HARDWARE_EXTRA_MODULE + #endif // _BOARD_SKY9X_H_ diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 4e07b6191..5ebafccdc 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -808,7 +808,7 @@ void auxSerialStop(); #define BLUETOOTH_FACTORY_BAUDRATE 57600 #endif #define BT_TX_FIFO_SIZE 64 -#define BT_RX_FIFO_SIZE 128 +#define BT_RX_FIFO_SIZE 256 void bluetoothInit(uint32_t baudrate, bool enable); void bluetoothWriteWakeup(); uint8_t bluetoothIsWriting(); diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index 4a2eb1497..b1d1a9a50 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -21,28 +21,24 @@ void bootloaderDrawFilename(const char *str, uint8_t line, bool selected) void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) { lcdClear(); - lcdDrawText(0, 0, BOOTLOADER_TITLE, INVERS); + lcdDrawText(LCD_W / 2, 0, BOOTLOADER_TITLE, CENTERED); + lcdInvertLine(0); if (st == ST_START) { - lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware"); - lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM"); - lcdDrawTextAlignedLeft(4*FH, "\010Exit"); + lcdDrawText(3*FW, 2*FH, "Write Firmware", opt == 0 ? INVERS : 0); + lcdDrawText(3*FW, 3*FH, "Restore EEPROM", opt == 1 ? INVERS : 0); + lcdDrawText(3*FW, 4*FH, "Exit", opt == 2 ? INVERS : 0); -#if LCD_W >= 212 - lcdDrawTextAlignedLeft(6*FH, "\001Curr FW:"); - lcdDrawText(50, 6*FH, getOtherVersion(nullptr)); -#else - lcdDrawTextAlignedLeft(6 * FH, "\001FW:"); + lcdDrawText(LCD_W / 2, 5 * FH + FH / 2, STR_OR_PLUGIN_USB_CABLE, CENTERED); - // Remove opentx- from string - const char *other_ver = getOtherVersion(nullptr); - if (strstr(other_ver, "opentx-")) - other_ver = other_ver + 7; - lcdDrawText(20, 6 * FH, other_ver); + // Remove "opentx-" from string + const char * vers = getFirmwareVersion(); +#if LCD_W < 212 + if (strncmp(vers, "opentx-", 7) == 0) + vers += 7; #endif - - lcdInvertLine(2 + opt); - lcdDrawTextAlignedLeft(7 * FH, STR_OR_PLUGIN_USB_CABLE); + lcdDrawText(LCD_W / 2, 7 * FH, vers, CENTERED); + lcdInvertLine(7); } else if (st == ST_USB) { lcdDrawTextAlignedLeft(4 * FH, STR_USB_CONNECTED); @@ -65,11 +61,11 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) } else if (opt == FC_OK) { if (memoryType == MEM_FLASH) { - const char * vers = getOtherVersion((char *) Block_buffer); + const char * vers = getFirmwareVersion((const char *)Block_buffer); #if LCD_W < 212 - // Remove opentx- from string - if (strstr(vers, "opentx-")) - vers = vers + 7; + // Remove "opentx-" from string + if (strncmp(vers, "opentx-", 7) == 0) + vers += 7; #endif bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); } diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index e0f216615..291af37bf 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -69,7 +69,7 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId) void processCrossfireTelemetryValue(uint8_t index, int32_t value) { - if(!TELEMETRY_STREAMING()) + if (!TELEMETRY_STREAMING()) return; const CrossfireSensor & sensor = crossfireSensors[index]; @@ -201,6 +201,7 @@ void processCrossfireTelemetryData(uint8_t data) auxSerialPutc(data); } #endif + #if defined(AUX2_SERIAL) if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { aux2SerialPutc(data); diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 623ecb67d..751196d1c 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -192,7 +192,7 @@ enum FrSkyDataState { #define DIY_STREAM_FIRST_ID 0x5000 #define DIY_STREAM_LAST_ID 0x50FF #define FACT_TEST_ID 0xF000 -#define FRAME_LOSS_RATE_ID 0xF010 +#define VALID_FRAME_RATE_ID 0xF010 #define RSSI_ID 0xF101 #define ADC1_ID 0xF102 #define ADC2_ID 0xF103 diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp index 36bcad041..9938373d1 100644 --- a/radio/src/telemetry/frsky_d.cpp +++ b/radio/src/telemetry/frsky_d.cpp @@ -227,6 +227,8 @@ void processHubPacket(uint8_t id, int16_t value) else if (id == VOLTS_ID) { unit = UNIT_CELLS; uint32_t cellData = (uint32_t)data; + if (((cellData & 0x00F0) >> 4) >= MAX_CELLS) + return; data = ((cellData & 0x00F0) << 12) + (((((cellData & 0xFF00) >> 8) + ((cellData & 0x000F) << 8))) / 5); } else if (id == GPS_DAY_MONTH_ID) { @@ -264,7 +266,7 @@ void processHubPacket(uint8_t id, int16_t value) data *= 10; } } - + setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_D, id, 0, 0, data, unit, precision); } @@ -326,4 +328,4 @@ void frskyDSetDefault(int index, uint16_t id) } storageDirty(EE_MODEL); -} +} \ No newline at end of file diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index f1de5bd23..d9bc12ae7 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -30,7 +30,7 @@ struct FrSkySportSensor { }; const FrSkySportSensor sportSensors[] = { - { FRAME_LOSS_RATE_ID, FRAME_LOSS_RATE_ID, 0, ZSTR_FLR, UNIT_PERCENT, 0 }, + { VALID_FRAME_RATE_ID, VALID_FRAME_RATE_ID, 0, ZSTR_VFR, UNIT_PERCENT, 0 }, { RSSI_ID, RSSI_ID, 0, STR_SENSOR_RSSI, UNIT_DB, 0 }, #if defined(MULTIMODULE) { TX_RSSI_ID, TX_RSSI_ID, 0, STR_SENSOR_TX_RSSI , UNIT_DB , 0 }, @@ -139,6 +139,8 @@ void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, u if (unit == UNIT_CELLS) { uint8_t cellsCount = (data & 0xF0) >> 4; uint8_t cellIndex = (data & 0x0F); + if (cellIndex >= MAX_CELLS) + return; uint32_t mask = (cellsCount << 24) + (cellIndex << 16); setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_SPORT, id, subId, instance, mask + (((data & 0x000FFF00) >> 8) / 5), unit, precision); if (cellIndex+1 < cellsCount) { @@ -222,9 +224,19 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe } #endif } + else if (dataId == VALID_FRAME_RATE_ID) { + data = 100 - SPORT_DATA_U8(packet); + } else if (dataId == R9_PWR_ID) { - uint32_t r9pwr[] = {100, 200, 500, 1000}; - data = r9pwr[SPORT_DATA_U8(packet) & 0x03]; + // convert 'dBm' to 'mW' + static const uint32_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10}, {13, 20}, {14, 25}, {20, 100}, {23, 200}, {27, 500}, {30, 1000}}; + uint32_t dBm = SPORT_DATA_U8(packet); + for (auto & r9pwr : r9pwrs) { + if (dBm == r9pwr[0]) { + data = r9pwr[1]; + break; + } + } } else if (dataId == XJT_VERSION_ID) { telemetryData.xjtVersion = HUB_DATA_U16(packet); diff --git a/radio/src/telemetry/hott.cpp b/radio/src/telemetry/hott.cpp index 2692d822f..8806094e8 100644 --- a/radio/src/telemetry/hott.cpp +++ b/radio/src/telemetry/hott.cpp @@ -16,26 +16,27 @@ #include "opentx.h" /* Telemetry -packet[0] = TX RSSI value -packet[1] = TX LQI value -packet[2] = frame number -packet[3-12] telemetry data +packet[0] = TX RSSI value +packet[1] = TX LQI value +packet[2] = Telemetry type +packet[3] = Telemetry page +packet[4-13] = Telemetry data -The frame number takes the following values: 0x00, 0x01, 0x02, 0x03 and 0x04. The frames can be present or not, they also do not have to follow each others. -Here is a description of the telemetry data for each frame number: -- frame 0x00 -[3] = [12] = ?? -[4] = RX_Voltage*10 in V -[5] = Temperature-20 in °C -[6] = RX_RSSI -[7] = RX_LQI ?? -[8] = RX_STR ?? -[9,10] = [10]*256+[9]=max lost packet time in ms, max value seems 2s=0x7D0 -[11] = 0x00 ?? -- frame 0x01 Unknown -- frame 0x02 Unknown -- frame 0x03 Unknown -- frame 0x04 Unknown +Telemetry type: 0x00 RX, 0x09 Vario, 0x0A GPS, 0x0B not seen, 0x0C ESC, 0x0D GAM, 0x0E EAM, 0x80 Text config mode +Telemetry page: 0x00..0x04 for all telemetry except Text config mode which is 0x00..0x12. The pages can be present or not, they also do not have to follow each others. + +Here is a description of the RX telemetry: + [2] = 0x00 -> Telemetry type RX + [3] = 0x00 -> Telemetry page 0 + [4] = ?? looks to be a copy of [7] + [5] = RX_Voltage*10 in V + [6] = Temperature-20 in °C + [7] = RX_RSSI CC2500 formated (a<128:a/2-71dBm, a>=128:(a-256)/2-71dBm) + [8] = RX_LQI in % + [9] = RX_MIN_Voltage*10 in V + [10,11] = [11]*256+[10]=max lost packet time in ms, max value seems 2s=0x7D0 + [12] = 0x00 ?? + [13] = ?? looks to be a copy of [7] */ struct HottSensor @@ -49,22 +50,54 @@ struct HottSensor // telemetry frames enum { - HOTT_FRAME_00 = 0x00, - HOTT_FRAME_01 = 0x01, - HOTT_FRAME_02 = 0x02, - HOTT_FRAME_03 = 0x03, - HOTT_FRAME_04 = 0x04, + HOTT_PAGE_00 = 0x00, + HOTT_PAGE_01 = 0x01, + HOTT_PAGE_02 = 0x02, + HOTT_PAGE_03 = 0x03, + HOTT_PAGE_04 = 0x04, }; -#define HOTT_TELEM_NORMAL 0x00 -#define HOTT_TELEM_BIND 0x40 -#define HOTT_TELEM_MENU 0x80 +enum +{ + HOTT_TELEM_RX = 0x00, + HOTT_TELEM_VARIO = 0x09, + HOTT_TELEM_GPS = 0x0A, + HOTT_TELEM_ESC = 0x0C, + HOTT_TELEM_GAM = 0x0D, + HOTT_TELEM_EAM = 0x0E, + HOTT_TELEM_TEXT = 0x80, +}; // telemetry sensors ID enum { HOTT_ID_RX_VOLTAGE = 0x0004, // RX_Batt Voltage HOTT_ID_TEMP1 = 0x0005, // RX Temperature sensor + HOTT_ID_VARIO = 0x0006, // Vario sensor + HOTT_ID_ALT = 0x0007, // Alt sensor + HOTT_ID_HDG = 0x0008, // Heading sensor + HOTT_ID_GSPD = 0x0008, // Ground speed sensor + HOTT_ID_GPS_LAT_LONG = 0x0009, // GPS sensor + HOTT_ID_GPS_COUNT = 0x000A, // GPS sat count + HOTT_ID_CELS = 0x000B, // Cels L sensor + HOTT_ID_CELS_H = 0x000C, // Cels H sensor + HOTT_ID_VOLT1 = 0x000D, // Voltage sensor + HOTT_ID_VOLT2 = 0x000E, // Voltage sensor + HOTT_ID_AMP1 = 0x000F, // Amp sensor + HOTT_ID_AMP2 = 0x0010, // Amp sensor + HOTT_ID_RPM1 = 0x0011, // RPM sensor + HOTT_ID_RPM2 = 0x0012, // RPM sensor + HOTT_ID_ESC_VIN = 0x0013, // ESC Volt + HOTT_ID_ESC_CUR = 0x0014, // ESC Amp + HOTT_ID_ESC_TBEC = 0x0015, // BEC Temp + HOTT_ID_ESC_BCUR = 0x0016, // BEC Cur + HOTT_ID_ESC_VBEC = 0x0017, // BEC Volt + HOTT_ID_BCAPA = 0x0018, // Batt capacity + HOTT_ID_TEMP2 = 0x0019, // Temperature sensor 2 + HOTT_ID_AIR_SPEED = 0x001A, + HOTT_ID_VOLT3 = 0x001B, // Voltage sensor + HOTT_ID_FUEL = 0x001C, // Fuel percentage + HOTT_TX_RSSI_ID = 0xFF00, // Pseudo id outside 1 byte range of Hott sensors HOTT_TX_LQI_ID = 0xFF01, // Pseudo id outside 1 byte range of Hott sensors HOTT_RX_RSSI_ID = 0xFF02, // Pseudo id outside 1 byte range of Hott sensors @@ -72,18 +105,39 @@ enum }; const HottSensor hottSensors[] = { - //frame 00 - {HOTT_ID_RX_VOLTAGE, STR_SENSOR_BATT, UNIT_VOLTS, 1}, // RX_Batt Voltage - {HOTT_ID_TEMP1, STR_SENSOR_TEMP1, UNIT_CELSIUS, 0}, // RX Temperature sensor - //frame 01 - //frame 02 - //frame 03 - //frame 04 - {HOTT_TX_RSSI_ID, STR_SENSOR_TX_RSSI, UNIT_RAW, 0}, // Pseudo id outside 1 byte range of Hott sensors - {HOTT_TX_LQI_ID, STR_SENSOR_TX_QUALITY, UNIT_RAW, 0}, // Pseudo id outside 1 byte range of Hott sensors - {HOTT_RX_RSSI_ID, STR_SENSOR_RSSI, UNIT_DB, 0}, // RX RSSI - {HOTT_RX_LQI_ID, STR_SENSOR_RX_QUALITY, UNIT_RAW, 0}, // RX LQI - {0x00, NULL, UNIT_RAW, 0}, // sentinel + //HOTT_TELEM_RX + {HOTT_ID_RX_VOLTAGE, STR_SENSOR_BATT, UNIT_VOLTS, 1}, // RX_Batt Voltage + {HOTT_ID_TEMP1, STR_SENSOR_TEMP1, UNIT_CELSIUS, 0}, // Temperature sensor 1 + {HOTT_ID_TEMP2, ZSTR_TEMP2, UNIT_CELSIUS, 0}, // Temperature sensor 2 + {HOTT_ID_VARIO, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 2}, // Vario sensor + {HOTT_ID_ALT, ZSTR_ALT, UNIT_METERS, 0}, // Alt sensor + {HOTT_ID_HDG, ZSTR_HDG, UNIT_DEGREE, 0}, // Heading sensor + {HOTT_ID_GSPD, ZSTR_GSPD, UNIT_KMH, 0}, // Ground speed sensor + {HOTT_ID_GPS_LAT_LONG, ZSTR_GPS, UNIT_GPS, 0}, // GPS position + {HOTT_ID_GPS_COUNT, ZSTR_SATELLITES, UNIT_RAW, 0}, // GPS sat count + {HOTT_ID_VOLT1, ZSTR_A1, UNIT_VOLTS, 1}, // Voltage sensor 1 + {HOTT_ID_VOLT2, ZSTR_A2, UNIT_VOLTS, 1}, // Voltage sensor 2 + {HOTT_ID_VOLT3, ZSTR_A3, UNIT_VOLTS, 1}, // Voltage sensor 3 + {HOTT_ID_AMP1, ZSTR_CURR, UNIT_AMPS, 1}, // Amp sensor 1 + {HOTT_ID_AMP2, ZSTR_CURR, UNIT_AMPS, 1}, // Amp sensor 2 + {HOTT_ID_RPM1, ZSTR_RPM, UNIT_RPMS, 0}, // RPM1 + {HOTT_ID_RPM2, ZSTR_RPM2, UNIT_RPMS, 0}, // RPM2 + {HOTT_ID_ESC_VIN, ZSTR_ESC_VIN, UNIT_VOLTS, 1}, // ESC VIN + {HOTT_ID_BCAPA, ZSTR_SMART_BAT_CAPACITY, UNIT_MAH, 0}, // Batt Capa + {HOTT_ID_ESC_CUR, ZSTR_ESC_CUR, UNIT_AMPS, 1}, // ESC Amp + {HOTT_ID_ESC_TBEC, ZSTR_ESC_TBEC, UNIT_CELSIUS, 0}, // ESC BEC Temp + {HOTT_ID_ESC_BCUR, ZSTR_ESC_BCUR, UNIT_AMPS, 1}, // ESC BEC Amp + {HOTT_ID_ESC_VBEC, ZSTR_ESC_VBEC, UNIT_VOLTS, 1}, // ESC BEC Volt + {HOTT_ID_CELS, ZSTR_CELLS, UNIT_CELLS, 2}, // Batt cells + {HOTT_ID_CELS_H, ZSTR_CELLS, UNIT_CELLS, 2}, // Batt H cells + {HOTT_ID_AIR_SPEED, ZSTR_ASPD, UNIT_KMH, 0}, // Air speed + {HOTT_ID_FUEL, ZSTR_FUEL, UNIT_PERCENT, 0}, // Fuel + + {HOTT_TX_RSSI_ID, STR_SENSOR_TX_RSSI, UNIT_DB, 0}, // Pseudo id outside 1 byte range of Hott sensors + {HOTT_TX_LQI_ID, STR_SENSOR_TX_QUALITY, UNIT_RAW, 0}, // Pseudo id outside 1 byte range of Hott sensors + {HOTT_RX_RSSI_ID, STR_SENSOR_RSSI, UNIT_DB, 0}, // RX RSSI + {HOTT_RX_LQI_ID, STR_SENSOR_RX_QUALITY, UNIT_RAW, 0}, // RX LQI + {0x00, NULL, UNIT_RAW, 0}, // sentinel }; const HottSensor * getHottSensor(uint16_t id) @@ -95,22 +149,30 @@ const HottSensor * getHottSensor(uint16_t id) return nullptr; } +int16_t processHoTTdBm(uint8_t value) +{ + if (value >= 128) { + value = 256 - value; + } + return value / 2 -71; +} + void processHottPacket(const uint8_t * packet) { // Set TX RSSI Value - setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_TX_RSSI_ID, 0, 0, packet[0]>>1, UNIT_RAW, 0); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_TX_RSSI_ID, 0, 0, processHoTTdBm(packet[0]), UNIT_RAW, 0); // Set TX LQI Value setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_TX_LQI_ID, 0, 0, packet[1], UNIT_RAW, 0); #if defined(LUA) - #define HOTT_MENU_NBR_PAGE 0x13 +#define HOTT_MENU_NBR_PAGE 0x13 // Config menu consists of the different telem pages put all together // [3] = config mennu page 0x00 to 0x12. // Page X [4] = seems like all the telem pages with the same value are going together to make the full config menu text. Seen so far 'a', 'b', 'c', 'd' // Page X [5..13] = 9 ascii chars to be displayed, char is highlighted when ascii|0x80 // Screen display is 21 characters large which means that once the first 21 chars are filled go to the begining of the next line // Menu commands are sent through TX packets: - // packet[28]= 0xXF=>no key press, 0xXD=>down, 0xXB=>up, 0xX9=>enter, 0xXE=>right, 0xX7=>left with X=0 or D + // packet[28]= 0xXF=>no key press, 0xXD=>down, 0xXB=>up, 0xX9=>enter, 0xXE=>right, 0xX7=>left with X=0, 9=Vario, A=GPS, B=Unknown, C=ESC, D=GAM, or E=EAM // packet[29]= 0xX1/0xX9 with X=0 or X counting 0,1,1,2,2,..,9,9 if (Multi_Buffer && memcmp(Multi_Buffer, "HoTT", 4) == 0) { // HoTT Lua script is running @@ -118,21 +180,31 @@ void processHottPacket(const uint8_t * packet) // Init memset(&Multi_Buffer[6], ' ', HOTT_MENU_NBR_PAGE * 9); // Clear text buffer } - - if (packet[3] < HOTT_MENU_NBR_PAGE && Multi_Buffer[5] >= 0xD7 && Multi_Buffer[5] <= 0xDF) { - Multi_Buffer[4] = packet[4]; // Store current menu being received + + if (packet[2] == HOTT_TELEM_TEXT && packet[3] < HOTT_MENU_NBR_PAGE && (Multi_Buffer[5] & 0x80) && (Multi_Buffer[5] & 0x0F) >= 0x07) { + Multi_Buffer[4] = packet[4]; // Store detected sensors memcpy(&Multi_Buffer[6 + packet[3] * 9], &packet[5], 9); // Store the received page in the buffer } return; } #endif + struct HottGPSMinutes + { + uint16_t value: 14; + uint16_t isNegative: 1; + uint16_t spare: 1; + }; + const HottSensor * sensor; int32_t value; + static uint8_t prev_page = 0, prev_value = 0; + static HottGPSMinutes min = {}; + int16_t deg = 0, sec = 0; - if (packet[2] == HOTT_TELEM_NORMAL) { - switch (packet[3]) { - case HOTT_FRAME_00: + switch (packet[2]) { // Telemetry type + case HOTT_TELEM_RX: + if (packet[3] == 0) { // Telemetry page: only page 0 is for RX // RX_VOLT value = packet[5]; sensor = getHottSensor(HOTT_ID_RX_VOLTAGE); @@ -142,21 +214,433 @@ void processHottPacket(const uint8_t * packet) sensor = getHottSensor(HOTT_ID_TEMP1); setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, 0, value, sensor->unit, sensor->precision); // RX_RSSI - setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_RX_RSSI_ID, 0, 0, packet[7], UNIT_DB, 0); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_RX_RSSI_ID, 0, 0, processHoTTdBm(packet[7]), UNIT_DB, 0); // RX_LQI telemetryData.rssi.set(packet[8]); if (packet[8] > 0) telemetryStreaming = TELEMETRY_TIMEOUT10ms; setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_RX_LQI_ID, 0, 0, packet[8], UNIT_RAW, 0); - break; + } + break; - default: - // unknown - value = (packet[7] << 24) | (packet[6] << 16) | (packet[5] << 8) | packet[4]; - setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, 0xFE00 | packet[3], 0, 0, value, UNIT_RAW, 0); - break; - } + case HOTT_TELEM_VARIO: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L240 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + // packet[6 ] uint8_t altitude_L; //#06 Altitude low uint8_t. In meters. A value of 500 means 0m + // packet[7 ] uint8_t altitude_H; //#07 Altitude high uint8_t + value = packet[6] + (packet[7] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_VARIO, value, sensor->unit, sensor->precision); + + // packet[12] uint8_t climbrate_L; //#12 Climb rate in m/s. Steps of 0.01m/s. Value of 30000 = 0.00 m/s + // packet[13] uint8_t climbrate_H; //#13 Climb rate in m/s + value = packet[12] + (packet[13] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_VARIO, value, sensor->unit, sensor->precision); + break; + case HOTT_PAGE_02: + // packet[12] uint8_t compass_direction; //#42 Compass heading in 2� steps. 1 = 2� + value = packet[12] * 2; + sensor = getHottSensor(HOTT_ID_HDG); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_HDG, 0, HOTT_TELEM_VARIO, value, sensor->unit, sensor->precision); + break; + case HOTT_PAGE_03: + break; + case HOTT_PAGE_04: + break; + } + break; + + case HOTT_TELEM_GPS: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L378 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + // packet[7 ] uint8_t flight_direction; //#07 flight direction in 2 degreees/step (1 = 2degrees); + value = packet[7] * 2; + sensor = getHottSensor(HOTT_ID_HDG); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_HDG, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + + // packet[8 ] uint8_t gps_speed_L; //08 km/h + // packet[9 ] uint8_t gps_speed_H; //#09 + value = packet[8] + (packet[9] << 8); + sensor = getHottSensor(HOTT_ID_GSPD); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GSPD, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + + // packet[10] uint8_t pos_NS; //#10 north = 0, south = 1 + // packet[11] uint8_t pos_NS_dm_L; //#11 degree minutes ie N48�39�988 + // packet[12] uint8_t pos_NS_dm_H; //#12 + // packet[13] uint8_t pos_NS_sec_L; //#13 position seconds + min.value = (int16_t) (packet[11] + (packet[12] << 8)); + if (packet[10] == 1) { + min.isNegative = true; + } + break; + + case HOTT_PAGE_02: + if (prev_page == ((HOTT_TELEM_GPS << 4) | HOTT_PAGE_01)) { + // packet[4 ] uint8_t pos_NS_sec_H; //#14 + deg = min.value / 100; + min.value = min.value - deg * 100; + sec = prev_value + (packet[4] << 8); + value = deg * 1000000 + (min.value * 1000000 + sec * 100) / 60; + if (min.isNegative) { + value = -value; + } + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GPS_LAT_LONG, 0, HOTT_TELEM_GPS, value, UNIT_GPS_LATITUDE, 0); + } + + // packet[5 ] uint8_t pos_EW; //#15 east = 0, west = 1 + // packet[6 ] uint8_t pos_EW_dm_L; //#16 degree minutes ie. E9�25�9360 + // packet[7 ] uint8_t pos_EW_dm_H; //#17 + // packet[8 ] uint8_t pos_EW_sec_L; //#18 position seconds + // packet[9 ] uint8_t pos_EW_sec_H; //#19 + min.value = (int16_t) (packet[6] + (packet[7] << 8)); + sec = (int16_t) (packet[8] + (packet[9] << 8)); + deg = min.value / 100; + min.value = min.value - deg * 100; + value = deg * 1000000 + (min.value * 1000000 + sec * 100) / 60; + if (packet[5] == 1) { + value = -value; + } + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GPS_LAT_LONG, 0, HOTT_TELEM_GPS, value, UNIT_GPS_LONGITUDE, 0); + // packet[10] uint8_t home_distance_L; //#20 meters + // packet[11] uint8_t home_distance_H; //#21 + + // packet[12] uint8_t altitude_L; //#22 meters. Value of 500 = 0m + // packet[13] uint8_t altitude_H; //#23 + value = packet[12] + (packet[13] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_03: + // packet[4 ] uint8_t climbrate_L; //#24 m/s 0.01m/s resolution. Value of 30000 = 0.00 m/s + // packet[5 ] uint8_t climbrate_H; //#25 + value = packet[4] + (packet[5] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + + // packet[6 ] uint8_t climbrate3s; //#26 climbrate in m/3s resolution, value of 120 = 0 m/3s + // packet[7 ] uint8_t gps_satelites; //#27 sat count + sensor = getHottSensor(HOTT_ID_GPS_COUNT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GPS_COUNT, 0, HOTT_TELEM_GPS, packet[7], sensor->unit, sensor->precision); + // packet[8 ] uint8_t gps_fix_char; //#28 GPS fix character. display, 'D' = DGPS, '2' = 2D, '3' = 3D, '-' = no fix. Where appears this char??? + // packet[9 ] uint8_t home_direction;//#29 direction from starting point to Model position (2 degree steps) + // packet[10] uint8_t angle_roll; //#30 angle roll in 2 degree steps + // packet[11] uint8_t angle_nick; //#31 angle in 2degree steps + // packet[12] uint8_t angle_compass; //#32 angle in 2degree steps. 1 = 2�, 255 = - 2� (1 uint8_t) North = 0� + // packet[13] uint8_t gps_time_h; //#33 UTC time hours + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t gps_time_m; //#34 UTC time minutes + // packet[5 ] uint8_t gps_time_s; //#35 UTC time seconds + // packet[6 ] uint8_t gps_time_sss; //#36 UTC time milliseconds + // packet[7 ] uint8_t msl_altitude_L;//#37 mean sea level altitude + // packet[8 ] uint8_t msl_altitude_H;//#38 + // packet[9 ] uint8_t vibration; //#39 vibrations level in % + // packet[10] uint8_t free_char1; //#40 appears right to home distance + // packet[11] uint8_t free_char2; //#41 appears right to home direction + // packet[12] uint8_t free_char3; //#42 GPS ASCII D=DGPS 2=2D 3=3D -=No Fix + break; + } + break; + + case HOTT_TELEM_ESC: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L454 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + // packet[7 ] uint8_t input_v_L; //#07 Input voltage low byte + // packet[8 ] uint8_t input_v_H; //#08 + value = packet[7] + (packet[8] << 8); + sensor = getHottSensor(HOTT_ID_ESC_VIN); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_VIN, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[11] uint8_t batt_cap_L; //#11 battery capacity in 10mAh steps + // packet[12] uint8_t batt_cap_H; //#12 + value = (packet[11] + (packet[12] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_BCAPA); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[13] uint8_t esc_temp; //#13 ESC temperature + value = packet[13] - 20; + sensor = getHottSensor(HOTT_ID_TEMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_02: + // packet[5 ] uint8_t current_L; //#15 Current in 0.1 steps + // packet[6 ] uint8_t current_H; //#16 + value = packet[5] + (packet[6] << 8); + sensor = getHottSensor(HOTT_ID_ESC_CUR); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_CUR, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t rpm_L; //#19 RPM in 10U/min steps + // packet[10] uint8_t rpm_H; //#20 + value = (packet[9] + (packet[10] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM1, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_03: + // packet[8 ] uint8_t bec_v; //#28 BEC voltage + value = packet[8]; + sensor = getHottSensor(HOTT_ID_ESC_VBEC); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_VBEC, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[10] uint8_t bec_current; //#30 BEC current + value = packet[10]; + sensor = getHottSensor(HOTT_ID_ESC_BCUR); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_BCUR, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t bec_temp; //#34 BEC temperature + value = packet[4] - 20; + sensor = getHottSensor(HOTT_ID_ESC_TBEC); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_TBEC, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t motor_temp; //#36 Motor or external sensor temperature + value = packet[6] - 20; + sensor = getHottSensor(HOTT_ID_TEMP2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP2, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + } + break; + + case HOTT_TELEM_GAM: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L151 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + sensor = getHottSensor(HOTT_ID_CELS); + // packet[7 ] uint8_t cell1_L; //#07 cell 1 voltage lower value. 0.02V steps, 124=2.48V + value = packet[7] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 0 << 16 | value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t cell2_L; //#08 + value = packet[8] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 1 << 16 | value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t cell3_L; //#09 + value = packet[9] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 2 << 16 | value, sensor->unit, sensor->precision); + // packet[10] uint8_t cell4_L; //#10 + value = packet[10] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 3 << 16 | value, sensor->unit, sensor->precision); + // packet[11] uint8_t cell5_L; //#11 + value = packet[11] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 4 << 16 | value, sensor->unit, sensor->precision); + // packet[12] uint8_t cell6_L; //#12 + value = packet[12] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 5 << 16 | value, sensor->unit, sensor->precision); + // packet[13] uint8_t batt1_L; //#13 battery 1 voltage LSB value. 0.1V steps. 50 = 5.5V + break; + + case HOTT_PAGE_02: + if (prev_page == ((HOTT_TELEM_GAM << 4) | HOTT_PAGE_01)) { + // packet[4 ] uint8_t batt1_H; //#14 + value = prev_value + (packet[4] << 8); + sensor = getHottSensor(HOTT_ID_VOLT2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT2, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + } + // packet[5 ] uint8_t batt2_L; //#15 battery 2 voltage LSB value. 0.1V steps. 50 = 5.5V + // packet[6 ] uint8_t batt2_H; //#16 + value = packet[5] + (packet[6] << 8); + sensor = getHottSensor(HOTT_ID_VOLT3); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT3, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[7 ] uint8_t temperature1; //#17 temperature 1. offset of 20. a value of 20 = 0�C + value = packet[7] - 20; + sensor = getHottSensor(HOTT_ID_TEMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t temperature2; //#18 temperature 2. offset of 20. a value of 20 = 0�C + value = packet[8] - 20; + sensor = getHottSensor(HOTT_ID_TEMP2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP2, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t fuel_procent; //#19 Fuel capacity in %. Values 0--100, graphical display ranges: 0-25% 50% 75% 100% + value = packet[9]; + sensor = getHottSensor(HOTT_ID_FUEL); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_FUEL, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[10] uint8_t fuel_ml_L; //#20 Fuel in ml scale. Full = 65535! + // packet[11] uint8_t fuel_ml_H; //#21 + // packet[12] uint8_t rpm_L; //#22 RPM in 10 RPM steps. 300 = 3000rpm + // packet[13] uint8_t rpm_H; //#23 + value = (packet[12] + (packet[13] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_03: + // packet[4 ] uint8_t altitude_L; //#24 altitude in meters. offset of 500, 500 = 0m + // packet[5 ] uint8_t altitude_H; //#25 + value = packet[4] + (packet[5] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t climbrate_L; //#26 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s + // packet[7 ] uint8_t climbrate_H; //#27 + value = packet[6] + (packet[7] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t climbrate3s; //#28 climb rate in m/3sec. Value of 120 = 0m/3sec + // packet[9 ] uint8_t current_L; //#29 current in 0.1A steps + // packet[10] uint8_t current_H; //#30 + value = packet[9] + (packet[10] << 8); + sensor = getHottSensor(HOTT_ID_AMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AMP1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[11] uint8_t main_voltage_L; //#31 Main power voltage using 0.1V steps + // packet[12] uint8_t main_voltage_H; //#32 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_VOLT1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[13] uint8_t batt_cap_L; //#33 used battery capacity in 10mAh steps + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t batt_cap_H; //#34 + if (prev_page == ((HOTT_TELEM_GAM << 4) | HOTT_PAGE_03)) { + value = (prev_value + (packet[4] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_BCAPA); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + } + // packet[5 ] uint8_t speed_L; //#35 (air?) speed in km/h(?) we are using ground speed here per default + // packet[6 ] uint8_t speed_H; //#36 + value = packet[5] + (packet[6] << 8); + sensor = getHottSensor(HOTT_ID_AIR_SPEED); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AIR_SPEED, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[7 ] uint8_t min_cell_volt; //#37 minimum cell voltage in 2mV steps. 124 = 2,48V + // packet[8 ] uint8_t min_cell_volt_num; //#38 number of the cell with the lowest voltage + // packet[9 ] uint8_t rpm2_L; //#39 RPM in 10 RPM steps. 300 = 3000rpm + // packet[10] uint8_t rpm2_H; //#40 + value = (packet[9] + (packet[10] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM2, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[11] uint8_t general_error_number;//#41 Voice error == 12. TODO: more docu + // packet[12] uint8_t pressure; //#42 Pressure up to 16bar. 0,1bar scale. 20 = 2bar + break; + } + break; + + case HOTT_TELEM_EAM: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L288 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + sensor = getHottSensor(HOTT_ID_CELS); + // packet[7 ] uint8_t cell1_L; //#07 cell 1 voltage lower value. 0.02V steps, 124=2.48V + value = packet[7] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 0 << 16 | value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t cell2_L; //#08 + value = packet[8] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 1 << 16 | value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t cell3_L; //#09 + value = packet[9] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 2 << 16 | value, sensor->unit, sensor->precision); + // packet[10] uint8_t cell4_L; //#10 + value = packet[10] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 3 << 16 | value, sensor->unit, sensor->precision); + // packet[11] uint8_t cell5_L; //#11 + value = packet[11] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 4 << 16 | value, sensor->unit, sensor->precision); + // packet[12] uint8_t cell6_L; //#12 + value = packet[12] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 5 << 16 | value, sensor->unit, sensor->precision); + // packet[13] uint8_t cell7_L; //#13 + // value = packet[13] << 1; + // if(value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 6 << 16 | value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_02: + sensor = getHottSensor(HOTT_ID_CELS); + // packet[4 ] uint8_t cell1_H; //#14 cell 1 voltage high value. 0.02V steps, 124=2.48V + value = packet[4] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 0 << 16 | value, sensor->unit, sensor->precision); + // packet[5 ] uint8_t cell2_H; //#15 + value = packet[5] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 1 << 16 | value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t cell3_H; //#16 + value = packet[6] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 2 << 16 | value, sensor->unit, sensor->precision); + // packet[7 ] uint8_t cell4_H; //#17 + value = packet[7] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 3 << 16 | value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t cell5_H; //#18 + value = packet[8] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 4 << 16 | value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t cell6_H; //#19 + value = packet[9] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 5 << 16 | value, sensor->unit, sensor->precision); + // packet[10] uint8_t cell7_H; //#20 + //value = packet[10] << 1; + //if(value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 13 << 16 | value, sensor->unit, sensor->precision); + // packet[11] uint8_t batt1_voltage_L; //#21 battery 1 voltage lower value in 100mv steps, 50=5V. optionally cell8_L value 0.02V steps + // packet[12] uint8_t batt1_voltage_H; //#22 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_VOLT2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT2, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[13] uint8_t batt2_voltage_L; //#23 battery 2 voltage lower value in 100mv steps, 50=5V. optionally cell8_H value. 0.02V steps + break; + + case HOTT_PAGE_03: + if (prev_page == ((HOTT_TELEM_EAM << 4) | HOTT_PAGE_02)) { + // packet[4 ] uint8_t batt2_voltage_H; //#24 + value = prev_value + (packet[4] << 8); + sensor = getHottSensor(HOTT_ID_VOLT3); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT3, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + } + // packet[5 ] uint8_t temp1; //#25 Temperature sensor 1. 20=0�, 46=26� - offset of 20. + value = packet[5] - 20; + sensor = getHottSensor(HOTT_ID_TEMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t temp2; //#26 temperature sensor 2 + value = packet[6] - 20; + sensor = getHottSensor(HOTT_ID_TEMP2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP2, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[7 ] uint8_t altitude_L; //#27 Attitude lower value. unit: meters. Value of 500 = 0m + // packet[8 ] uint8_t altitude_H; //#28 + value = packet[7] + (packet[8] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[9 ] uint8_t current_L; //#29 Current in 0.1 steps + // packet[10] uint8_t current_H; //#30 + value = packet[9] + (packet[10] << 8); + sensor = getHottSensor(HOTT_ID_AMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AMP1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[11] uint8_t main_voltage_L; //#31 Main power voltage (drive) in 0.1V steps + // packet[12] uint8_t main_voltage_H; //#32 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_VOLT1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[13] uint8_t batt_cap_L; //#33 used battery capacity in 10mAh steps + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t batt_cap_H; //#34 + if (prev_page == ((HOTT_TELEM_EAM << 4) | HOTT_PAGE_03)) { + value = (prev_value + (packet[4] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_BCAPA); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + } + + // packet[5 ] uint8_t climbrate_L; //#35 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s + // packet[6 ] uint8_t climbrate_H; //#36 + value = packet[5] + (packet[6] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[7 ] uint8_t climbrate3s; //#37 climbrate in m/3sec. Value of 120 = 0m/3sec + // packet[8 ] uint8_t rpm_L; //#38 RPM. Steps: 10 U/min + // packet[9 ] uint8_t rpm_H; //#39 + value = (packet[8] + (packet[9] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[10] uint8_t electric_min; //#40 Electric minutes. Time does start, when motor current is > 3 A + // packet[11] uint8_t electric_sec; //#41 + // packet[12] uint8_t speed_L; //#42 (air?) speed in km/h. Steps 1km/h + // packet[13] uint8_t speed_H; //#43 + value = packet[12] + (packet[13] << 8); + sensor = getHottSensor(HOTT_ID_AIR_SPEED); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AIR_SPEED, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + break; + } + break; } + prev_page = (packet[2] << 4) | packet[3]; // concatenate telemetry type and page + prev_value = packet[13]; // page overflow } void hottSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance) diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 2b55eeadd..0e880e1a0 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -21,6 +21,7 @@ #include "telemetry.h" #include "multi.h" +constexpr int32_t MULTI_DESIRED_VERSION = (1 << 24) | (3 << 16) | (1 << 8) | 1; #define MULTI_CHAN_BITS 11 extern uint8_t g_moduleIdx; @@ -561,7 +562,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const return; } - if (major <= 1 && minor <= 3 && revision <= 0 && patch < 91 && SLOW_BLINK_ON_PHASE) { + if ((((major << 24) | (minor << 16) | (revision << 8) | patch) < MULTI_DESIRED_VERSION) && SLOW_BLINK_ON_PHASE) { strcpy(statusText, STR_MODULE_UPGRADE); } else { diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index 9db8d629f..3e99b27f4 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -27,6 +27,7 @@ #define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! #define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] +#define MAX_CELLS 6 class TelemetryValue { public: diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 66b0e2255..0896e1424 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -90,6 +90,8 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32 uint32_t data = uint32_t(newVal); uint8_t cellsCount = (data >> 24); uint8_t cellIndex = ((data >> 16) & 0x0F); + if (cellIndex >= MAX_CELLS) + return; uint16_t cellValue = (data & 0xFFFF); if (cellsCount == 0) { cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count); @@ -497,7 +499,7 @@ int setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, ui { bool sensorFound = false; - for (int index=0; indexinstance == instance) + return true; + + if (protocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { +#if defined(SIMU) + if (((this->instance ^ instance) & 0x1F) == 0) + return true; +#else + if (((this->instance ^ instance) & 0x9F) == 0 && (this->instance >> 5) != TELEMETRY_ENDPOINT_SPORT && (instance >> 5) != TELEMETRY_ENDPOINT_SPORT) { + this->instance = instance; // update the instance in case we had telemetry switching + return true; + } +#endif + } + + return false; +} diff --git a/radio/src/telemetry/telemetry_sensors.h b/radio/src/telemetry/telemetry_sensors.h index def941861..6ca1c0c97 100644 --- a/radio/src/telemetry/telemetry_sensors.h +++ b/radio/src/telemetry/telemetry_sensors.h @@ -57,7 +57,7 @@ class TelemetryItem } consumption; struct { uint8_t count; - CellValue values[6]; + CellValue values[MAX_CELLS]; } cells; struct { uint16_t year; // full year (4 digits) diff --git a/radio/src/tests/fonts_480x272.png b/radio/src/tests/fonts_480x272.png index c47657715..abd3e1f72 100644 Binary files a/radio/src/tests/fonts_480x272.png and b/radio/src/tests/fonts_480x272.png differ diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 9f4f77ace..55218bbc5 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -65,6 +65,7 @@ inline void MODEL_RESET() memset(&anaInValues, 0, sizeof(anaInValues)); extern uint8_t s_mixer_first_run_done; s_mixer_first_run_done = false; + evalMixes(1); // this is needed to reset fp_act lastFlightMode = 255; } diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index eaf4a675b..44ab6fdaf 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -47,6 +47,22 @@ class MixerTest : public OpenTxTest {}; } \ } while (0) +#define CHECK_FLIGHT_MODE_TRANSITION(channel, duration, initValue, endValue) \ + do { \ + uint32_t delta = 0xffff / duration; \ + int32_t weightInit = 0xffff; \ + int32_t weightEnd = 0; \ + for (int i = 0; i <= (duration); i++) { \ + evalMixes(1); \ + GTEST_ASSERT_LE( abs(((initValue) * weightInit + (endValue) * weightEnd) / 0xffff - channelOutputs[(channel)]), 1); \ + weightInit = weightInit - delta; \ + weightEnd = weightEnd + delta; \ + } \ + for (int i = 0; i < 100; i++) { /* be sure the transition is finished*/ \ + evalMixes(1); \ + } \ + } while (0) + TEST_F(TrimsTest, throttleTrim) { g_model.thrTrim = 1; @@ -659,3 +675,48 @@ TEST(Trainer, UnpluggedTest) ppmInput[0] = 1024; CHECK_DELAY(0, 5000); } + +TEST_F(MixerTest, flightModeTransition) +{ + SYSTEM_RESET(); + MODEL_RESET(); + MIXER_RESET(); + modelDefault(0); + g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[0].fadeIn = 100; + g_model.flightModeData[0].fadeOut = 100; + g_model.flightModeData[1].fadeIn = 100; + g_model.flightModeData[1].fadeOut = 100; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].flightModes = 0b11110; + g_model.mixData[0].weight = 100; + g_model.mixData[1].destCh = 0; + g_model.mixData[1].mltpx = MLTPX_REP; + g_model.mixData[1].srcRaw = MIXSRC_MAX; + g_model.mixData[1].flightModes = 0b11101; + g_model.mixData[1].weight = -10; + evalMixes(1); + simuSetSwitch(0, 1); + CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, -102); +} + +TEST_F(MixerTest, flightModeOverflow) +{ + SYSTEM_RESET(); + MODEL_RESET(); + MIXER_RESET(); + modelDefault(0); + g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[0].fadeIn = 100; + g_model.flightModeData[0].fadeOut = 100; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].flightModes = 0; + g_model.mixData[0].weight = 250; + evalMixes(1); + simuSetSwitch(0, 1); + CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, 1024); +} diff --git a/radio/src/tests/primitives_480x272.png b/radio/src/tests/primitives_480x272.png index 38630592f..68bb2f886 100644 Binary files a/radio/src/tests/primitives_480x272.png and b/radio/src/tests/primitives_480x272.png differ diff --git a/radio/src/tests/transparency_480x272.png b/radio/src/tests/transparency_480x272.png index 05845c138..2b0588eb9 100644 Binary files a/radio/src/tests/transparency_480x272.png and b/radio/src/tests/transparency_480x272.png differ diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index c877dbad7..a2aff466c 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit c877dbad7823f306ed6273629bd256581a91b357 +Subproject commit a2aff466ca9776b4fe156d823111eac8d667ae71 diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0a9a4b131..1cdcdb28c 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -296,6 +296,7 @@ const char STR_BEEP_VOLUME[] = INDENT TR_BEEP_VOLUME; const char STR_WAV_VOLUME[] = INDENT TR_WAV_VOLUME; const char STR_BG_VOLUME[] = INDENT TR_BG_VOLUME; const char STR_SELECT_MODEL[] = TR_SELECT_MODEL; +const char STR_SELECT_MODE[] = TR_SELECT_MODE; const char STR_CREATE_CATEGORY[] = TR_CREATE_CATEGORY; const char STR_RENAME_CATEGORY[] = TR_RENAME_CATEGORY; const char STR_DELETE_CATEGORY[] = TR_DELETE_CATEGORY; diff --git a/radio/src/translations.h b/radio/src/translations.h index 55bf01d35..787143aba 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -481,6 +481,7 @@ extern const char STR_BEEP_VOLUME[]; extern const char STR_WAV_VOLUME[]; extern const char STR_BG_VOLUME[]; extern const char STR_SELECT_MODEL[]; +extern const char STR_SELECT_MODE[]; extern const char STR_CREATE_CATEGORY[]; extern const char STR_RENAME_CATEGORY[]; extern const char STR_DELETE_CATEGORY[]; diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt index a26644a28..0e0bf0967 100644 --- a/radio/src/translations/cn.h.txt +++ b/radio/src/translations/cn.h.txt @@ -701,6 +701,7 @@ #define TR_VOLTAGE TR(INDENT "Voltage", INDENT "Voltage source") #define TR_CURRENT TR(INDENT "Current", INDENT "Current source") #define TR_SELECT_MODEL "Select model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create category" #define TR_RENAME_CATEGORY "Rename category" #define TR_DELETE_CATEGORY "Delete category" @@ -1223,7 +1224,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 20595e331..44e2938bf 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -687,6 +687,7 @@ #define TR_VOLTAGE INDENT"Napětí" #define TR_CURRENT INDENT"Proud" #define TR_SELECT_MODEL "Vyber model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Nová kategorie" #define TR_RENAME_CATEGORY "Přejmenovat kategorii" #define TR_DELETE_CATEGORY "Odstranit kategorii" @@ -846,7 +847,7 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("Chyba zápisu FW", "Chyba zápisu firmware") #define TR_FIRMWARE_UPDATE_SUCCESS "Úspěšný zápis FW" -#define TR_WRITING TR3("\14Zapisuji..", "\032Zapisuji..", "Zapisuji..") +#define TR_WRITING "Zapisuji.." #define TR_CONFIRM_FORMAT "Provést Formát?" #define TR_INTERNALRF "Interní RF modul" #define TR_INTERNAL_MODULE "Interní modul" @@ -911,7 +912,7 @@ #define TR_POWERMETER_ATTN_NEEDED "Útlumový člen nutný!" #define TR_PXX2_SELECT_RX "Vyber RX..." #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Vyberte zařízení..." +#define TR_BT_SELECT_DEVICE "Vyberte zařízení" #define TR_DISCOVER "Hledat" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Čekám..." @@ -1203,7 +1204,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index fb6e32efc..ce4dfc4df 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -694,6 +694,7 @@ #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro #define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle") #define TR_SELECT_MODEL "Modell auswählen" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Modelltyp erstellen" #define TR_RENAME_CATEGORY "Modelltyp umbenennen" #define TR_DELETE_CATEGORY "Modelltyp löschen" @@ -918,9 +919,9 @@ #define TR_BYTES "Bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1217,7 +1218,7 @@ #define TR_AUTH_FAILURE "Auth-failure" // ---------------------------------------------------------------- -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index bd0c24665..0767a59b0 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -691,6 +691,7 @@ #define TR_VOLTAGE TR(INDENT "Voltage", INDENT "Voltage source") #define TR_CURRENT TR(INDENT "Current", INDENT "Current source") #define TR_SELECT_MODEL "Select model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create category" #define TR_RENAME_CATEGORY "Rename category" #define TR_DELETE_CATEGORY "Delete category" @@ -853,8 +854,8 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" -#define TR_INTERNAL_MODULE TR("Int. module","Internal module") -#define TR_EXTERNAL_MODULE TR("Ext. module","External module") +#define TR_INTERNAL_MODULE TR("Int. module", "Internal module") +#define TR_EXTERNAL_MODULE TR("Ext. module", "External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" #define TR_TELEMETRY_DISABLED "Telem. disabled" #define TR_MORE_OPTIONS_AVAILABLE "More options available" @@ -915,9 +916,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1214,7 +1215,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index d710e5b0f..2847c3bf6 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -243,12 +243,12 @@ #define TR_FSW_RESET_TELEM TR("Telm", "Telemetría") #if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " + #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " #else #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" #endif -#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "Todo" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "Todo\0 " TR_FSW_RESET_TELEM) +#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "Todo" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "Vuelo\0 " TR_FSW_RESET_TELEM) #define LEN_FUNCSOUNDS TR("\004", "\006") #define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Avs1""Avs2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Aviso1""Aviso2""Cheep ""Ratata""Tick ""Sirena""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") @@ -695,6 +695,7 @@ #define TR_VOLTAGE INDENT"Voltaje" #define TR_CURRENT INDENT"Actual" #define TR_SELECT_MODEL TR("Selec. modelo", "Seleccionar modelo") +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Crear categoría" #define TR_RENAME_CATEGORY "Renombrar categoría" #define TR_DELETE_CATEGORY "Borrar categoría" @@ -921,7 +922,7 @@ #define TR_POWERMETER_ATTN_NEEDED "Necesita atenuador" #define TR_PXX2_SELECT_RX "Selecciona RX..." #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Selecciona dispositivo..." +#define TR_BT_SELECT_DEVICE "Selecciona dispositivo" #define TR_DISCOVER "Buscar" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Espera..." @@ -1216,7 +1217,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") #define TR_AUTH_FAILURE "Fallo " LCDW_128_480_LINEBREAK "autentificación" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index e21621409..de8bedec1 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -711,6 +711,7 @@ #define TR_VOLTAGE INDENT"Voltage" #define TR_CURRENT INDENT"Current" #define TR_SELECT_MODEL "Select Model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -935,9 +936,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1225,7 +1226,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index dc846f080..92630d9bd 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -714,6 +714,7 @@ #define TR_VOLTAGE TR(INDENT "Tension",INDENT "Source tension") #define TR_CURRENT TR(INDENT "Courant",INDENT "Source courant") #define TR_SELECT_MODEL "Sélect. modèle" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Créer une catégorie" #define TR_RENAME_CATEGORY "Renommer la catégorie" #define TR_DELETE_CATEGORY "Supprimer la catégorie" @@ -872,7 +873,7 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("Erreur màj FW","Erreur de mise à jour") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" -#define TR_WRITING TR("\14Ecriture...", "\032Ecriture...") +#define TR_WRITING "Ecriture..." #define TR_CONFIRM_FORMAT "Confirmer Formatage?" #define TR_INTERNALRF "HF interne" #define TR_INTERNAL_MODULE TR("Module int.","Module interne") @@ -939,7 +940,7 @@ #define TR_POWERMETER_ATTN_NEEDED "Atténuateur requis" #define TR_PXX2_SELECT_RX "Sélect RX..." #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Sélect appareil..." +#define TR_BT_SELECT_DEVICE "Sélect appareil" #define TR_DISCOVER "Découvrir" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Attente..." @@ -1240,7 +1241,7 @@ #define TR_RTC_CHECK TR("Vérif. RTC", "Vérif. pile RTC") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 3c15fa2ab..e5c843a71 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -716,6 +716,7 @@ #define TR_VOLTAGE TR(INDENT "Voltagg.",INDENT "Voltaggio") #define TR_CURRENT TR(INDENT "Corrente",INDENT "Corrente") #define TR_SELECT_MODEL TR("Scegli mod.", "Scegli Modello") +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Crea Categoria" #define TR_RENAME_CATEGORY "Rinomina Categoria" #define TR_DELETE_CATEGORY "Cancella Categoria" @@ -1237,7 +1238,7 @@ #define TR_RTC_CHECK TR("Controllo RTC", "Controllo voltaggio RTC") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 467bf8fca..38fc8e581 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -698,6 +698,7 @@ #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spanningsbron") //9XR-Pro #define TR_CURRENT TR(INDENT "Stroom", INDENT "Stroombron") #define TR_SELECT_MODEL "Kies Model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -857,9 +858,9 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Schrijven..." -#define TR_CONFIRM_FORMAT "Formatteren bevestigen?" -#define TR_INTERNALRF "Interne RF" +#define TR_WRITING "Schrijven..." +#define TR_CONFIRM_FORMAT "Formatteren bevestigen?" +#define TR_INTERNALRF "Interne RF" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" @@ -922,9 +923,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1224,7 +1225,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 1685075f0..69053d33b 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -712,6 +712,7 @@ #define TR_VOLTAGE TR (INDENT"Napięcie",INDENT"Źródło Napięcia") #define TR_CURRENT TR (INDENT"Prąd",INDENT"Źródło Prądu") #define TR_SELECT_MODEL "Wybór modelu" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -871,9 +872,9 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Zapis... " -#define TR_CONFIRM_FORMAT "Zatwierdź Format?" -#define TR_INTERNALRF "Wewn.Moduł RF" +#define TR_WRITING "Zapis... " +#define TR_CONFIRM_FORMAT "Zatwierdź Format?" +#define TR_INTERNALRF "Wewn.Moduł RF" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" @@ -936,9 +937,9 @@ #define TR_BYTES "bajty" #define TR_MODULE_BIND TR("[BND]","[Bind]") #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1233,7 +1234,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index d269a643c..2c5d8a499 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -702,6 +702,7 @@ #define TR_VOLTAGE INDENT"Volts" #define TR_CURRENT INDENT"Amperes" #define TR_SELECT_MODEL "Selec. Modelo" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -926,9 +927,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1222,7 +1223,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index ee3124cd1..6210631e5 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -714,6 +714,7 @@ #define TR_VOLTAGE INDENT"Volt" #define TR_CURRENT INDENT"Ampere" #define TR_SELECT_MODEL "Välj Modell" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Skapa Kategori" #define TR_RENAME_CATEGORY "Byt Kat.namn" #define TR_DELETE_CATEGORY "Ta Bort Kategori" @@ -874,9 +875,9 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Skriver..." -#define TR_CONFIRM_FORMAT "Formatera Minnet?" -#define TR_INTERNALRF "Intern Radio" +#define TR_WRITING "Skriver..." +#define TR_CONFIRM_FORMAT "Formatera Minnet?" +#define TR_INTERNALRF "Intern Radio" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" @@ -939,9 +940,9 @@ #define TR_BYTES "byte" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." @@ -1236,7 +1237,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index bdd1413d1..dfe97c014 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -83,7 +83,7 @@ #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI #endif -#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS TR_GYR_VSRCRAW "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW +#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_GYR_VSRCRAW "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW #define LEN_CRSF_BAUDRATE "\004" #define TR_CRSF_BAUDRATE "115k""400k" @@ -136,7 +136,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0""JJRC345" +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartc""ESky-v2""DSM RX\0""JJRC345""Q90C\0 " #define LEN_PPM_POL "\001" #define TR_PPM_POL "+""-" diff --git a/tools/build-frsky.py b/tools/build-frsky.py index e4478a2a8..5a5cb26ac 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -87,6 +87,14 @@ boards = { "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, + "X9E": { + "PCB": "X9E", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, "X7_FCC": { "PCB": "X7", "LUA": "NO_MODEL_SCRIPTS", @@ -114,7 +122,32 @@ boards = { "MULTIMODULE": "NO", "CROSSFIRE": "NO", "DEFAULT_MODE": "2", - } + }, + "X10S": { + "PCB": "X10", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, + "X10SExpress": { + "PCB": "X10", + "PCBREV": "EXPRESS", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, + "X12S": { + "PCB": "X12S", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, } translations = [ diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index a15b698e7..92b5542f0 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -5,7 +5,7 @@ set -e set -x # Allow variable core usage, default uses all cpu cores, to set 8 cores for example : commit-tests.sh -j8 -num_cpus=$(grep 'physical id' /proc/cpuinfo | sort -u | wc -l) +num_cpus=$(nproc) : "${CORES:=$num_cpus}" # Default build treats warnings as errors, set -Wno-error to override, e.g.: commit-tests.sh -Wno-error : "${WERROR:=1}"