diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp index c731260b6..cab5fcccf 100644 --- a/companion/src/apppreferencesdialog.cpp +++ b/companion/src/apppreferencesdialog.cpp @@ -215,7 +215,6 @@ void AppPreferencesDialog::accept() } Firmware::setCurrentVariant(newFw); profile.fwName(""); - profile.resetFwVariables(); profile.fwType(newFw->getId()); fwchange = true; } @@ -362,7 +361,8 @@ void AppPreferencesDialog::initSettings() ui->profileNameLE->setText(profile.name()); QString hwSettings; - if (profile.stickPotCalib() == "" ) { + + if (profile.generalSettings().isEmpty()) { hwSettings = tr("EMPTY: No radio settings stored in profile"); } else { @@ -372,6 +372,7 @@ void AppPreferencesDialog::initSettings() else hwSettings = tr("AVAILABLE: Radio settings stored %1").arg(str); } + ui->lblGeneralSettings->setText(hwSettings); ui->chkPromptSDSync->setChecked(profile.runSDSync()); ui->lblRadioColorSample->setPalette(QPalette(profile.radioSimCaseColor())); diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui index 895f25ae7..5f849357a 100644 --- a/companion/src/apppreferencesdialog.ui +++ b/companion/src/apppreferencesdialog.ui @@ -35,7 +35,7 @@ - 1 + 0 @@ -94,7 +94,7 @@ - General Settings + Radio Settings @@ -522,7 +522,7 @@ Mode 4: - General Settings Label + Radio Settings Label diff --git a/companion/src/firmwares/edgetx/yaml_switchconfig.cpp b/companion/src/firmwares/edgetx/yaml_switchconfig.cpp index 7e0b782e5..8a14d902b 100644 --- a/companion/src/firmwares/edgetx/yaml_switchconfig.cpp +++ b/companion/src/firmwares/edgetx/yaml_switchconfig.cpp @@ -112,6 +112,7 @@ void YamlStickConfig::copy(GeneralSettings::InputConfig* rhs) const { for (int i = 0; i < Boards::getCapability(getCurrentBoard(), Board::Inputs); i++) { if (config[i].type == (unsigned int)Board::AIT_STICK) { + rhs[i].inverted = config[i].inverted; memcpy(rhs[i].name, config[i].name, sizeof(HARDWARE_NAME_LEN)); } } diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index 412dbdde0..973a950b4 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -270,6 +270,8 @@ class Firmware virtual bool isAvailable(PulsesProtocol proto, int port=0) = 0; + virtual QString getLanguage() const = 0; + const int getFlashSize(); static Firmware * getFirmwareForId(const QString & id); diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index a7e58fd41..8038c33d5 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -196,31 +196,9 @@ void GeneralSettings::clear() void GeneralSettings::init() { - Firmware * firmware = Firmware::getCurrentVariant(); - Board::Type board = firmware->getBoard(); - - // vBatWarn is voltage in 100mV, vBatMin is in 100mV but with -9V offset, vBatMax has a -12V offset + Board::Type board = Firmware::getCurrentVariant()->getBoard(); Boards::getBattRange(board, vBatMin, vBatMax, vBatWarn); - backlightMode = 3; // keys and sticks - backlightDelay = 2; // 2 * 5 = 10 secs - inactivityTimer = 10; - - hatsMode = HATSMODE_SWITCHABLE; - - // backlightBright = 0; // 0 = 100% - - if (IS_FAMILY_HORUS_OR_T16(board)) { - backlightOffBright = 20; - } - - speakerVolume = 12; - wavVolume = 2; - backgroundVolume = 1; - - if (IS_TARANIS(board)) - contrast = 25; - if (IS_JUMPER_T16(board)) strcpy(bluetoothName, "t16"); else if (IS_FLYSKY_NV14(board)) @@ -240,110 +218,29 @@ void GeneralSettings::init() else if (IS_TARANIS_X9E(board) || IS_TARANIS_SMALL(board)) strcpy(bluetoothName, "taranis"); - ttsLanguage[0] = 'e'; - ttsLanguage[1] = 'n'; + contrast = IS_TARANIS(board) ? 25 : 0; + backlightBright = 0; // 0 = 100% + backlightDelay = 2; // 2 * 5 = 10 secs + backlightMode = BACKLIGHT_MODE_KEYSCTRL; + backlightOffBright = IS_FAMILY_HORUS_OR_T16(board) ? 20 : 0; - templateSetup = g.profile[g.sessionId()].channelOrder(); - stickMode = g.profile[g.sessionId()].defaultMode(); - - QString t_calib = g.profile[g.sessionId()].stickPotCalib(); - if (!t_calib.isEmpty()) { - QString t_trainercalib=g.profile[g.sessionId()].trainerCalib(); - int8_t t_txVoltageCalibration=(int8_t)g.profile[g.sessionId()].txVoltageCalibration(); - int8_t t_txCurrentCalibration=(int8_t)g.profile[g.sessionId()].txCurrentCalibration(); - int8_t t_PPM_Multiplier=(int8_t)g.profile[g.sessionId()].ppmMultiplier(); - uint8_t t_stickMode=(uint8_t)g.profile[g.sessionId()].gsStickMode(); - uint8_t t_vBatWarn=(uint8_t)g.profile[g.sessionId()].vBatWarn(); - QString t_DisplaySet=g.profile[g.sessionId()].display(); - QString t_BeeperSet=g.profile[g.sessionId()].beeper(); - QString t_HapticSet=g.profile[g.sessionId()].haptic(); - QString t_SpeakerSet=g.profile[g.sessionId()].speaker(); - QString t_CountrySet=g.profile[g.sessionId()].countryCode(); - - if ((t_calib.length() == (Boards::getInputsCalibrated() * 12)) && (t_trainercalib.length() == 16)) { - QString Byte; - int16_t byte16; - bool ok; - for (int i = 0; i < Boards::getCapability(board, Board::Inputs); i++) { - if (Boards::isInputCalibrated(i)) { - Byte = t_calib.mid(i * 12, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) inputConfig[i].calib.mid = byte16; - Byte = t_calib.mid(4 + i * 12, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) inputConfig[i].calib.spanNeg = byte16; - Byte = t_calib.mid(8 + i * 12, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) inputConfig[i].calib.spanPos = byte16; - } - } - for (int i = 0; i < Boards::getCapability(board, Board::Sticks); i++) { - Byte = t_trainercalib.mid(i * 4, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) trainer.calib[i] = byte16; - } - txCurrentCalibration = t_txCurrentCalibration; - txVoltageCalibration = t_txVoltageCalibration; - vBatWarn = t_vBatWarn; - PPM_Multiplier = t_PPM_Multiplier; - stickMode = t_stickMode; - } - if ((t_DisplaySet.length()==6) && (t_BeeperSet.length()==4) && (t_HapticSet.length()==6) && (t_SpeakerSet.length()==6)) { - uint8_t byte8u; - int8_t byte8; - bool ok; - byte8=(int8_t)t_DisplaySet.mid(0,2).toInt(&ok,16); - if (ok) - optrexDisplay=(byte8==1 ? true : false); - byte8u=(uint8_t)t_DisplaySet.mid(2,2).toUInt(&ok,16); - if (ok) - contrast=byte8u; - byte8u=(uint8_t)t_DisplaySet.mid(4,2).toUInt(&ok,16); - if (ok) - backlightBright=byte8u; - byte8=(int8_t)t_BeeperSet.mid(0,2).toUInt(&ok,16); - if (ok) - beeperMode=(BeeperMode)byte8; - byte8=(int8_t)t_BeeperSet.mid(2,2).toInt(&ok,16); - if (ok) - beeperLength=byte8; - byte8=(int8_t)t_HapticSet.mid(0,2).toUInt(&ok,16); - if (ok) - hapticMode=(BeeperMode)byte8; - byte8=(int8_t)t_HapticSet.mid(2,2).toInt(&ok,16); - if (ok) - hapticStrength=byte8; - byte8=(int8_t)t_HapticSet.mid(4,2).toInt(&ok,16); - if (ok) - hapticLength=byte8; - byte8u=(uint8_t)t_SpeakerSet.mid(0,2).toUInt(&ok,16); - if (ok) - speakerMode=byte8u; - byte8u=(uint8_t)t_SpeakerSet.mid(2,2).toUInt(&ok,16); - if (ok) - speakerPitch=byte8u; - byte8u=(uint8_t)t_SpeakerSet.mid(4,2).toUInt(&ok,16); - if (ok) - speakerVolume=byte8u; - if (t_CountrySet.length()==6) { - byte8u=(uint8_t)t_CountrySet.mid(0,2).toUInt(&ok,16); - if (ok) - countryCode=byte8u; - byte8u=(uint8_t)t_CountrySet.mid(2,2).toUInt(&ok,16); - if (ok) - imperial=byte8u; - QString chars = t_CountrySet.mid(4, 2); - ttsLanguage[0] = chars[0].toLatin1(); - ttsLanguage[1] = chars[1].toLatin1(); - } - } - } + backgroundVolume = 1; + speakerVolume = 12; + wavVolume = 2; + hatsMode = HATSMODE_SWITCHABLE; + inactivityTimer = 10; internalModule = g.profile[g.sessionId()].defaultInternalModule(); - if (IS_FLYSKY_NV14(board) || IS_FAMILY_PL18(board)) - stickDeadZone = 2; + QString lang = getCurrentFirmware()->getLanguage(); + if (lang.size() > 1) + memcpy(ttsLanguage, lang.toLatin1().data(), 2); + else { + ttsLanguage[0] = 'e'; + ttsLanguage[1] = 'n'; + } + stickDeadZone = (IS_FLYSKY_NV14(board) || IS_FAMILY_PL18(board)) ? 2 : 0; } void GeneralSettings::setDefaultControlTypes(Board::Type board) @@ -1019,3 +916,47 @@ void GeneralSettings::switchConfigClear() for (int i = 0; i < CPN_MAX_SWITCHES; i++) switchConfig[i] = SwitchConfig(); } + +bool GeneralSettings::isBacklightModeAvailable(int index) +{ + int start = (Boards::getCapability(getCurrentFirmware()->getBoard(), Board::LcdDepth) >= 8) ? 1 : 0; + return index >= start; +} + +QString GeneralSettings::backlightModeToString() const +{ + return backlightModeToString(stickMode); +} + +// static +QString GeneralSettings::backlightModeToString(int value) +{ + switch(value) { + case BACKLIGHT_MODE_OFF: + return tr("OFF"); + case BACKLIGHT_MODE_KEYS: + return tr("Keys"); + case BACKLIGHT_MODE_CTRL: + return tr("Controls"); + case BACKLIGHT_MODE_KEYSCTRL: + return tr("Keys + Controls"); + case BACKLIGHT_MODE_ON: + return tr("ON"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +AbstractStaticItemModel * GeneralSettings::backlightModeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_GS_BACKLIGHTMODE); + + for (int i = 0; i < BACKLIGHT_MODE_COUNT; i++) { + mdl->appendToItemList(backlightModeToString(i), i, isBacklightModeAvailable(i)); + } + + mdl->loadItemList(); + return mdl; +} diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index bb31d7e60..674b77205 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -46,6 +46,7 @@ constexpr char AIM_GS_UARTSAMPLEMODE[] {"gs.uartsamplemode"}; constexpr char AIM_GS_HATSMODE[] {"gs.hatsmode"}; constexpr char AIM_GS_STICKMODE[] {"gs.stickmode"}; constexpr char AIM_GS_TEMPLATESETUP[] {"gs.templatesetup"}; +constexpr char AIM_GS_BACKLIGHTMODE[] {"gs.backlightmode"}; constexpr char AIM_TRAINERMIX_MODE[] {"trainermix.mode"}; constexpr char AIM_TRAINERMIX_SRC[] {"trainermix.src"}; @@ -215,6 +216,15 @@ class GeneralSettings { RadioTypeContextSurface = 1 << 2, }; + enum BacklightMode { + BACKLIGHT_MODE_OFF, + BACKLIGHT_MODE_KEYS, + BACKLIGHT_MODE_CTRL, + BACKLIGHT_MODE_KEYSCTRL, + BACKLIGHT_MODE_ON, + BACKLIGHT_MODE_COUNT, + }; + GeneralSettings() { clear(); } void clear(); void init(); @@ -399,6 +409,7 @@ class GeneralSettings { bool isSwitchFlex(int index) const; bool isSwitchFunc(int index) const; bool unassignedInputFlexSwitches() const; + static bool isBacklightModeAvailable(int index); QString antennaModeToString() const; QString bluetoothModeToString() const; @@ -408,6 +419,7 @@ class GeneralSettings { QString hatsModeToString() const; QString stickModeToString() const; QString templateSetupToString() const; + QString backlightModeToString() const; static QString antennaModeToString(int value); static QString bluetoothModeToString(int value); @@ -419,6 +431,7 @@ class GeneralSettings { static QString hatsModeToString(int value); static QString stickModeToString(int value); static QString templateSetupToString(int value, bool isBoardAir); + static QString backlightModeToString(int value); static AbstractStaticItemModel * antennaModeItemModel(bool model_setup = false); static AbstractStaticItemModel * bluetoothModeItemModel(); @@ -429,6 +442,7 @@ class GeneralSettings { static AbstractStaticItemModel * hatsModeItemModel(bool radio_setup = true); static AbstractStaticItemModel * stickModeItemModel(); static AbstractStaticItemModel * templateSetupItemModel(); + static AbstractStaticItemModel * backlightModeItemModel(); void validateFlexSwitches(); }; diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 56d9b5c5a..64b5092a9 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -391,6 +391,12 @@ QString OpenTxFirmware::getReleaseNotesUrl() return QString("%1/downloads").arg(EDGETX_HOME_PAGE_URL); } +QString OpenTxFirmware::getLanguage() const +{ + QStringList strl = getId().split('-'); + return strl.size() > 2 ? strl.at(2) : QString(); +} + // Firmware registrations // NOTE: "recognized" build options are defined in /radio/util/fwoptions.py diff --git a/companion/src/firmwares/opentx/opentxinterface.h b/companion/src/firmwares/opentx/opentxinterface.h index 55c51006b..40f63f8ca 100644 --- a/companion/src/firmwares/opentx/opentxinterface.h +++ b/companion/src/firmwares/opentx/opentxinterface.h @@ -91,6 +91,8 @@ class OpenTxFirmware: public Firmware return false; } + virtual QString getLanguage() const override; + protected: QString getFirmwareBaseUrl() { return ""; } // depreciated; diff --git a/companion/src/generaledit/generaledit.cpp b/companion/src/generaledit/generaledit.cpp index c97efc4ee..f6a403917 100644 --- a/companion/src/generaledit/generaledit.cpp +++ b/companion/src/generaledit/generaledit.cpp @@ -31,6 +31,7 @@ #include "generaloptions.h" #include "scrollarea.h" #include "compounditemmodels.h" +#include "firmwares/edgetx/edgetxinterface.h" GeneralEdit::GeneralEdit(QWidget * parent, RadioData & radioData, Firmware * firmware) : QDialog(parent), @@ -40,23 +41,8 @@ GeneralEdit::GeneralEdit(QWidget * parent, RadioData & radioData, Firmware * fir { ui->setupUi(this); this->setWindowIcon(CompanionIcon("open.png")); - - QString firmware_id = g.profile[g.id()].fwType(); - QString name=g.profile[g.id()].name(); - if (name.isEmpty()) { - ui->calstore_PB->setDisabled(true); - } - - ui->profile_CB->clear(); - for (int i = 0; i < MAX_PROFILES; ++i) { - QString name=g.profile[i].name(); - if (!name.isEmpty()) { - ui->profile_CB->addItem(name, i); - if (i == g.id()) { - ui->profile_CB->setCurrentIndex(ui->profile_CB->count() - 1); - } - } - } + ui->btnLoadSettings->setDisabled(g.currentProfile().generalSettings().isEmpty()); + ui->btnClearSettings->setDisabled(g.currentProfile().generalSettings().isEmpty()); editorItemModels = new CompoundItemModelFactory(&generalSettings, nullptr); // tabs created below expect these item models to be pre-registered @@ -112,207 +98,62 @@ void GeneralEdit::on_tabWidget_currentChanged(int index) panels[index]->update(); } -void GeneralEdit::on_calretrieve_PB_clicked() +void GeneralEdit::on_btnLoadSettings_clicked() { - Board::Type board = getCurrentBoard(); - int profile_id = ui->profile_CB->itemData(ui->profile_CB->currentIndex()).toInt(); - QString calib = g.profile[profile_id].stickPotCalib(); - int ttlSticks = getBoardCapability(board, Board::Sticks); - int ttlInputs = getBoardCapability(board, Board::Inputs); - int ttlSwitches = getBoardCapability(board, Board::Switches); - if (calib.isEmpty()) { + if (QMessageBox::question(this, tr("Profile Radio Settings"), + tr("WARNING: Loading settings from profile is irreversable.\n\nAre you sure?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) + return; + + QByteArray data = g.currentProfile().generalSettings(); + + try { + if (!loadRadioSettingsFromYaml(generalSettings, data)) { + QMessageBox::critical(this, tr("Profile Radio Settings"), tr("Unable to load settings from profile!")); + return; + } + } catch(const std::runtime_error& e) { + QMessageBox::critical(this, tr("Profile Radio Settings"), + tr("Unable to load settings from profile!") + ":\n" + QString(e.what())); return; } - else { - QString trainercalib = g.profile[profile_id].trainerCalib(); - QString hwtypes = g.profile[profile_id].controlTypes(); - QString controlNames = g.profile[profile_id].controlNames(); - int8_t txVoltageCalibration = (int8_t)g.profile[profile_id].txVoltageCalibration(); - int8_t txCurrentCalibration = (int8_t)g.profile[profile_id].txCurrentCalibration(); - int8_t PPM_Multiplier = (int8_t)g.profile[profile_id].ppmMultiplier(); - uint8_t GSStickMode = (uint8_t)g.profile[profile_id].gsStickMode(); - uint8_t vBatWarn = (uint8_t)g.profile[profile_id].vBatWarn(); - QString DisplaySet = g.profile[profile_id].display(); - QString BeeperSet = g.profile[profile_id].beeper(); - QString HapticSet = g.profile[profile_id].haptic(); - QString SpeakerSet = g.profile[profile_id].speaker(); - QString CountrySet = g.profile[profile_id].countryCode(); - if ((calib.length() == (Boards::getInputsCalibrated() * 12)) && (trainercalib.length() == 16)) { - QString Byte; - int16_t byte16; - bool ok; - for (int i = 0; i < ttlInputs; i++) { - if (Boards::isInputCalibrated(i)) { - Byte = calib.mid(i * 12, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) generalSettings.inputConfig[i].calib.mid = byte16; - Byte = calib.mid(4 + i * 12, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) generalSettings.inputConfig[i].calib.spanNeg = byte16; - Byte = calib.mid(8 + i * 12, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) generalSettings.inputConfig[i].calib.spanPos = byte16; - } - } - for (int i = 0; i < ttlSticks; i++) { - Byte = trainercalib.mid(i * 4, 4); - byte16 = (int16_t)Byte.toInt(&ok, 16); - if (ok) generalSettings.trainer.calib[i] = byte16; - } - generalSettings.txCurrentCalibration = txCurrentCalibration; - generalSettings.txVoltageCalibration = txVoltageCalibration; - generalSettings.vBatWarn=vBatWarn; - if (getCurrentFirmware()->getCapability(HasBatMeterRange)) { - generalSettings.vBatMin = (int8_t) g.profile[profile_id].vBatMin(); - generalSettings.vBatMax = (int8_t) g.profile[profile_id].vBatMax(); - } - generalSettings.PPM_Multiplier = PPM_Multiplier; - } else { - QMessageBox::critical(this, CPN_STR_TTL_WARNING, tr("Wrong data in profile, radio calibration was not retrieved")); - } - if (hwtypes.length() == ttlSwitches + ttlInputs) { - QString Byte; - int16_t byte16; - QByteArray qba; - bool ok; - for (int i = 0; i < ttlSwitches; i++) { - Byte = hwtypes.mid(i, 1); - byte16 = (int16_t)Byte.toInt(&ok, 16); - qba = controlNames.mid(3 * i, 3).toLatin1(); - if (ok) { - generalSettings.switchConfig[i].type = (Board::SwitchType)byte16; - strcpy(generalSettings.switchConfig[i].name, qba.data()); - } - } - for (int i = 0; i < getBoardCapability(board, Board::Inputs); i++) { - Byte = hwtypes.mid(i + ttlSwitches, 1); - byte16 = (int16_t)Byte.toInt(&ok, 16); - qba = controlNames.mid(3 * (i + ttlSwitches), 3).toLatin1(); - if (ok) { - generalSettings.inputConfig[i].flexType = (Board::FlexType)byte16; - strcpy(generalSettings.inputConfig[i].name, qba.data()); - } - } - } else { - QMessageBox::critical(this, CPN_STR_TTL_WARNING, tr("Wrong data in profile, Switch/pot config not retrieved")); - } - if ((DisplaySet.length()==6) && (BeeperSet.length()==4) && (HapticSet.length()==6) && (SpeakerSet.length()==6)) { - generalSettings.stickMode=GSStickMode; - uint8_t byte8u; - int8_t byte8; - QString chars; - bool ok; - byte8 = (int8_t)DisplaySet.mid(0,2).toInt(&ok, 16); - if (ok) generalSettings.optrexDisplay = (byte8 == 1 ? true : false); - byte8u = (uint8_t)DisplaySet.mid(2,2).toUInt(&ok, 16); - if (ok) generalSettings.contrast = byte8u; - byte8u = (uint8_t)DisplaySet.mid(4,2).toUInt(&ok, 16); - if (ok) generalSettings.backlightBright = byte8u; - byte8 = (int8_t)BeeperSet.mid(0,2).toUInt(&ok, 16); - if (ok) generalSettings.beeperMode = (GeneralSettings::BeeperMode)byte8; - byte8 = (int8_t)BeeperSet.mid(2,2).toInt(&ok, 16); - if (ok) generalSettings.beeperLength = byte8; - byte8 = (int8_t)HapticSet.mid(0,2).toUInt(&ok, 16); - if (ok) generalSettings.hapticMode = (GeneralSettings::BeeperMode)byte8; - byte8 = (int8_t)HapticSet.mid(2,2).toInt(&ok, 16); - if (ok) generalSettings.hapticStrength = byte8; - byte8 = (int8_t)HapticSet.mid(4,2).toInt(&ok, 16); - if (ok) generalSettings.hapticLength = byte8; - byte8u = (uint8_t)SpeakerSet.mid(0,2).toUInt(&ok, 16); - if (ok) generalSettings.speakerMode = byte8u; - byte8u = (uint8_t)SpeakerSet.mid(2,2).toUInt(&ok, 16); - if (ok) generalSettings.speakerPitch = byte8u; - byte8u = (uint8_t)SpeakerSet.mid(4,2).toUInt(&ok, 16); - if (ok) generalSettings.speakerVolume = byte8u; - if (CountrySet.length() == 6) { - byte8u = (uint8_t)CountrySet.mid(0,2).toUInt(&ok, 16); - if (ok) generalSettings.countryCode = byte8u; - byte8u = (uint8_t)CountrySet.mid(2,2).toUInt(&ok, 16); - if (ok) generalSettings.imperial = byte8u; - chars = CountrySet.mid(4,2); - generalSettings.ttsLanguage[0] = chars[0].toLatin1(); - generalSettings.ttsLanguage[1] = chars[1].toLatin1(); - } - } - else { - QMessageBox::critical(this, CPN_STR_TTL_WARNING, tr("Wrong data in profile, hw related parameters were not retrieved")); - } - } + on_tabWidget_currentChanged(ui->tabWidget->currentIndex()); + QMessageBox::information(this, tr("Profile Radio Settings"), + tr("Settings successfully loaded.") + "\n\n" + + tr("The Radio Settings window will now be closed for the settings to take effect")); emit modified(); + accept(); } -void GeneralEdit::on_calstore_PB_clicked() +void GeneralEdit::on_btnSaveSettings_clicked() { - Board::Type board = getCurrentBoard(); - int profile_id = ui->profile_CB->itemData(ui->profile_CB->currentIndex()).toInt(); - - QString name = g.profile[profile_id].name(); - if (name.isEmpty()) { - ui->calstore_PB->setDisabled(true); + if (QMessageBox::question(this, tr("Profile Radio Settings"), + tr("WARNING: Saving settings to the profile is irreversable.\n\nAre you sure?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) return; - } - else { - QString calib = g.profile[profile_id].stickPotCalib(); - QString hwtypes = g.profile[profile_id].controlTypes(); - QString controlNames = g.profile[profile_id].controlNames(); - if (!(calib.isEmpty())) { - int ret = QMessageBox::question(this, CPN_STR_APP_NAME, - tr("Do you want to store calibration in %1 profile
overwriting existing calibration?").arg(name) , - QMessageBox::Yes | QMessageBox::No); - if (ret == QMessageBox::No) { - return; - } - } - int ttlSticks = getBoardCapability(board, Board::Sticks); - int ttlInputs = getBoardCapability(board, Board::Inputs); - int ttlSwitches = getBoardCapability(board, Board::Switches); - calib.clear(); + QByteArray data; + writeRadioSettingsToYaml(generalSettings, data); + g.currentProfile().generalSettings(data); + QDateTime dateTime = QDateTime::currentDateTime(); + g.currentProfile().timeStamp(dateTime.toString("yyyy-MM-dd hh:mm")); + ui->btnLoadSettings->setEnabled(true); + ui->btnClearSettings->setEnabled(true); + QMessageBox::information(this, tr("Save Radio Settings to Profile"), tr("Settings saved to profile.")); +} - for (int i = 0; i < ttlInputs; i++) { - if (Boards::isInputCalibrated(i)) { - calib.append(QString("%1").arg((uint16_t)generalSettings.inputConfig[i].calib.mid, 4, 16, QChar('0'))); - calib.append(QString("%1").arg((uint16_t)generalSettings.inputConfig[i].calib.spanNeg, 4, 16, QChar('0'))); - calib.append(QString("%1").arg((uint16_t)generalSettings.inputConfig[i].calib.spanPos, 4, 16, QChar('0'))); - } - } - g.profile[profile_id].stickPotCalib( calib ); - calib.clear(); - for (int i = 0; i < ttlSticks; i++) { - calib.append(QString("%1").arg((uint16_t)generalSettings.trainer.calib[i], 4, 16, QChar('0'))); - } - g.profile[profile_id].trainerCalib( calib ); - hwtypes.clear(); - controlNames.clear(); - for (int i = 0; i < ttlSwitches; i++) { - hwtypes.append(QString("%1").arg((uint16_t)generalSettings.switchConfig[i].type, 1)); - controlNames.append(QString("%1").arg(generalSettings.switchConfig[i].name, -3)); - } - for (int i = 0; i < ttlInputs; i++) { - hwtypes.append(QString("%1").arg((uint16_t)generalSettings.inputConfig[i].flexType, 1)); - controlNames.append(QString("%1").arg(generalSettings.inputConfig[i].name, -3)); - } - g.profile[profile_id].controlTypes( hwtypes ); - g.profile[profile_id].controlNames( controlNames ); - g.profile[profile_id].txVoltageCalibration( generalSettings.txVoltageCalibration ); - g.profile[profile_id].txCurrentCalibration( generalSettings.txCurrentCalibration ); - g.profile[profile_id].vBatWarn( generalSettings.vBatWarn ); - if (getCurrentFirmware()->getCapability(HasBatMeterRange)) { - g.profile[profile_id].vBatMin( generalSettings.vBatMin ); - g.profile[profile_id].vBatMax( generalSettings.vBatMax ); - } - g.profile[profile_id].ppmMultiplier( generalSettings.PPM_Multiplier ); - g.profile[profile_id].gsStickMode( generalSettings.stickMode ); - g.profile[profile_id].display( QString("%1%2%3").arg((generalSettings.optrexDisplay ? 1:0), 2, 16, QChar('0')).arg((uint8_t)generalSettings.contrast, 2, 16, QChar('0')).arg((uint8_t)generalSettings.backlightBright, 2, 16, QChar('0')) ); - g.profile[profile_id].beeper( QString("%1%2").arg(((uint8_t)generalSettings.beeperMode), 2, 16, QChar('0')).arg((uint8_t)generalSettings.beeperLength, 2, 16, QChar('0'))); - g.profile[profile_id].haptic( QString("%1%2%3").arg(((uint8_t)generalSettings.hapticMode), 2, 16, QChar('0')).arg((int8_t)generalSettings.hapticStrength, 2, 16, QChar('0')).arg((uint8_t)generalSettings.hapticLength, 2, 16, QChar('0'))); - g.profile[profile_id].speaker( QString("%1%2%3").arg((uint8_t)generalSettings.speakerMode, 2, 16, QChar('0')).arg((uint8_t)generalSettings.speakerPitch, 2, 16, QChar('0')).arg((uint8_t)generalSettings.speakerVolume, 2, 16, QChar('0'))); - g.profile[profile_id].countryCode( QString("%1%2%3").arg((uint8_t)generalSettings.countryCode, 2, 16, QChar('0')).arg((uint8_t)generalSettings.imperial, 2, 16, QChar('0')).arg(generalSettings.ttsLanguage)); +void GeneralEdit::on_btnClearSettings_clicked() +{ + if (QMessageBox::question(this, tr("Profile Radio Settings"), + tr("WARNING: Clearing settings from the profile is irreversable.\n\nAre you sure?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) + return; - QDateTime dateTime = QDateTime::currentDateTime(); - g.profile[profile_id].timeStamp(dateTime.toString("yyyy-MM-dd hh:mm")); - QMessageBox::information(this, CPN_STR_APP_NAME, tr("Calibration and HW parameters saved.")); - } + g.currentProfile().generalSettings(QByteArray()); + g.currentProfile().timeStamp(QString()); + ui->btnLoadSettings->setEnabled(false); + ui->btnClearSettings->setEnabled(false); + QMessageBox::information(this, tr("Profile Radio Settings"), tr("Settings cleared from profile.")); } diff --git a/companion/src/generaledit/generaledit.h b/companion/src/generaledit/generaledit.h index feef88b45..0942452c5 100644 --- a/companion/src/generaledit/generaledit.h +++ b/companion/src/generaledit/generaledit.h @@ -69,8 +69,9 @@ class GeneralEdit : public QDialog private slots: void onTabModified(); void on_tabWidget_currentChanged(int index); - void on_calretrieve_PB_clicked(); - void on_calstore_PB_clicked(); + void on_btnClearSettings_clicked(); + void on_btnLoadSettings_clicked(); + void on_btnSaveSettings_clicked(); private: Firmware * firmware; diff --git a/companion/src/generaledit/generaledit.ui b/companion/src/generaledit/generaledit.ui index 96e89f536..c3db3b640 100644 --- a/companion/src/generaledit/generaledit.ui +++ b/companion/src/generaledit/generaledit.ui @@ -17,7 +17,7 @@ - Radio settings + Radio Settings true @@ -32,19 +32,26 @@ - QFrame::Panel + QFrame::Shape::Panel - QFrame::Raised + QFrame::Shadow::Raised - QLayout::SetDefaultConstraint + QLayout::SizeConstraint::SetDefaultConstraint - - - + + + + + Clear settings from profile + + + + + 0 @@ -52,17 +59,17 @@ - Retrieve calib. and hw settings from profile + Store settings in profile - + - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -72,8 +79,8 @@ - - + + 0 @@ -81,12 +88,22 @@ - Store calib. and hw settings in selected profile + Load settings from profile - - + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 96078c238..39638e763 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -29,6 +29,7 @@ constexpr char FIM_HATSMODE[] {"Hats Mode"}; constexpr char FIM_STICKMODE[] {"Stick Mode"}; constexpr char FIM_TEMPLATESETUP[] {"Template Setup"}; +constexpr char FIM_BACKLIGHTMODE[] {"Backlight Mode"}; GeneralSetupPanel::GeneralSetupPanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware): GeneralPanel(parent, generalSettings, firmware), @@ -46,6 +47,7 @@ ui(new Ui::GeneralSetup) Boards::isAir(board) ? GeneralSettings::RadioTypeContextAir : GeneralSettings::RadioTypeContextSurface), FIM_TEMPLATESETUP); + panelFilteredModels->registerItemModel(new FilteredItemModel(GeneralSettings::backlightModeItemModel()), FIM_BACKLIGHTMODE); QLabel *pmsl[] = {ui->ro_label, ui->ro1_label, ui->ro2_label, ui->ro3_label, ui->ro4_label, ui->ro5_label, ui->ro6_label, ui->ro7_label, ui->ro8_label, NULL}; QSlider *tpmsld[] = {ui->chkSA, ui->chkSB, ui->chkSC, ui->chkSD, ui->chkSE, ui->chkSF, ui->chkSG, ui->chkSH, NULL}; @@ -91,7 +93,8 @@ ui(new Ui::GeneralSetup) lock = true; - populateBacklightCB(); + ui->backlightswCB->setModel(panelFilteredModels->getItemModel(FIM_BACKLIGHTMODE)); + ui->backlightswCB->setCurrentIndex(ui->backlightswCB->findData(generalSettings.backlightMode)); if (!firmware->getCapability(MultiLangVoice)) { ui->VoiceLang_label->hide(); @@ -379,22 +382,6 @@ void GeneralSetupPanel::on_timezoneLE_textEdited(const QString &text) } } -void GeneralSetupPanel::populateBacklightCB() -{ - QComboBox * b = ui->backlightswCB; - const QStringList strings = { tr("OFF"), tr("Keys"), tr("Controls"), tr("Keys + Controls"), tr("ON") }; - - b->clear(); - int startValue = (Boards::getCapability(firmware->getBoard(), Board::LcdDepth) >= 8) ? 1 : 0; - - for (int i = startValue; i < strings.size(); i++) { - b->addItem(strings[i], 0); - if (generalSettings.backlightMode == i) { - b->setCurrentIndex(b->count() - 1); - } - } -} - void GeneralSetupPanel::populateVoiceLangCB() { QComboBox * b = ui->voiceLang_CB; diff --git a/companion/src/generaledit/generalsetup.h b/companion/src/generaledit/generalsetup.h index 9672eaf3b..94dce1efb 100644 --- a/companion/src/generaledit/generalsetup.h +++ b/companion/src/generaledit/generalsetup.h @@ -111,7 +111,6 @@ class GeneralSetupPanel : public GeneralPanel void showLabelSelectOptions(); void setValues(); - void populateBacklightCB(); void populateVoiceLangCB(); void updateVarioPitchRange(); }; diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index b69531350..823bdbba3 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -142,6 +142,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings if (count > 0) { addLabel(""); addLabel(tr("Name")); + addLabel(tr("Invert")); addParams(); for (int i = 0; i < count; i++) { addStick(i); diff --git a/companion/src/storage/appdata.cpp b/companion/src/storage/appdata.cpp index 0f4b0a5e3..a1609d3fa 100644 --- a/companion/src/storage/appdata.cpp +++ b/companion/src/storage/appdata.cpp @@ -329,12 +329,6 @@ bool Profile::existsOnDisk() return m_settings.contains(settingsPath() % "Name"); } -void Profile::resetFwVariables() -{ - for (const QString & name : fwVarsList()) - CompStoreObj::resetProperty(this, name); -} - // ** ComponentAssetData class******************** ComponentAssetData::ComponentAssetData() : CompStoreObj(), index(-1) diff --git a/companion/src/storage/appdata.h b/companion/src/storage/appdata.h index fa6744132..c6f03c314 100644 --- a/companion/src/storage/appdata.h +++ b/companion/src/storage/appdata.h @@ -471,7 +471,6 @@ class Profile: public CompStoreObj public slots: bool existsOnDisk(); - void resetFwVariables(); protected: explicit Profile(); @@ -506,38 +505,13 @@ class Profile: public CompStoreObj PROPERTY(bool, telemSimResetRssiOnStop, false) PROPERTY(QColor, radioSimCaseColor, QColor(Qt::black)) - // Firmware Variables - PROPERTYSTR2(beeper, "Beeper") - PROPERTYSTR2(countryCode, "countryCode") - PROPERTYSTR2(display, "Display") - PROPERTYSTR2(haptic, "Haptic") - PROPERTYSTR2(speaker, "Speaker") - PROPERTYSTR2(stickPotCalib, "StickPotCalib") - PROPERTYSTR2(timeStamp, "TimeStamp") - PROPERTYSTR2(trainerCalib, "TrainerCalib") - PROPERTYSTR2(controlTypes, "ControlTypes") - PROPERTYSTR2(controlNames, "ControlNames") - - PROPERTY4(int, gsStickMode, "GSStickMode", 0) - PROPERTY4(int, ppmMultiplier, "PPM_Multiplier", 0) - PROPERTY4(int, vBatWarn, "vBatWarn", 0) // not a typo.. vBat vs. Vbat - PROPERTY4(int, vBatMin, "VbatMin", 0) - PROPERTY4(int, vBatMax, "VbatMax", 0) - PROPERTY4(int, txCurrentCalibration, "currentCalib", 0) - PROPERTY4(int, txVoltageCalibration, "VbatCalib", 0) + // General settings + PROPERTYQBA(generalSettings) + PROPERTYSTR2(timeStamp, "TimeStamp") PROPERTYSTRD(jsName, "") int index; - - static const QStringList fwVarsList() //! for resetFwVariables()... TODO: make this go away - { - static const QStringList list({ - "Beeper", "countryCode", "Display", "Haptic", "Speaker", "TimeStamp", "TrainerCalib", "StickPotCalib", - "ControlTypes", "ControlNames", "GSStickMode", "PPM_Multiplier", "vBatWarn", "VbatMin", "VbatMax", "currentCalib", "VbatCalib" - }); - return list; - } }; //! \brief ComponentAssetData class stores properties related to each updateable component.