diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index a201d50ed..5a44d246e 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -20,6 +20,7 @@ #include "boards.h" #include "macros.h" +#include "compounditemmodels.h" // TODO remove all those constants // Update: These are now all only used within this class. @@ -374,7 +375,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) case MultiposPotsPositions: return IS_HORUS_OR_TARANIS(board) ? 6 : 0; - case Switches: + case Board::Switches: if (IS_TARANIS_X9E(board)) return 18; else if (board == Board::BOARD_TARANIS_X9LITE) @@ -410,11 +411,11 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) else if (IS_HORUS_X12S(board)) return 8; else - return getCapability(board, Switches); + return getCapability(board, Board::Switches); case SwitchPositions: if (IS_HORUS_OR_TARANIS(board)) - return getCapability(board, Switches) * 3; + return getCapability(board, Board::Switches) * 3; else return 9; @@ -425,10 +426,14 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return 4; case NumTrimSwitches: - return getCapability(board, NumTrims) * 2; - } + return getCapability(board, Board::NumTrims) * 2; - return 0; + case HasRTC: + return IS_STM32(board) ? true : false; + + default: + return 0; + } } QString Boards::getAxisName(int index) @@ -444,7 +449,7 @@ QString Boards::getAxisName(int index) if (index < (int)DIM(axes)) return axes[index]; else - return tr("Unknown"); + return CPN_STR_UNKNOWN_ITEM; } QString Boards::getAnalogInputName(Board::Type board, int index) @@ -595,6 +600,96 @@ QString Boards::getBoardName(Board::Type board) case BOARD_RADIOMASTER_T8: return "Radiomaster T8"; default: - return tr("Unknown"); + return CPN_STR_UNKNOWN_ITEM; } } + +// static +QString Boards::potTypeToString(int value) +{ + switch(value) { + case POT_NONE: + return tr("None"); + case POT_WITH_DETENT: + return tr("Pot with detent"); + case POT_MULTIPOS_SWITCH: + return tr("Multi pos switch"); + case POT_WITHOUT_DETENT: + return tr("Pot without detent"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + + +// static +QString Boards::sliderTypeToString(int value) +{ + switch(value) { + case SLIDER_NONE: + return tr("None"); + case SLIDER_WITH_DETENT: + return tr("Slider with detent"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +QString Boards::switchTypeToString(int value) +{ + switch(value) { + case SWITCH_NOT_AVAILABLE: + return tr("None"); + case SWITCH_TOGGLE: + return tr("2 Positions Toggle"); + case SWITCH_2POS: + return tr("2 Positions"); + case SWITCH_3POS: + return tr("3 Positions"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +AbstractStaticItemModel * Boards::potTypeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_BOARDS_POT_TYPE); + + for (int i = 0; i < POT_TYPE_COUNT; i++) { + mdl->appendToItemList(potTypeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +// static +AbstractStaticItemModel * Boards::sliderTypeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_BOARDS_SLIDER_TYPE); + + for (int i = 0; i < SLIDER_TYPE_COUNT; i++) { + mdl->appendToItemList(sliderTypeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +// static +AbstractStaticItemModel * Boards::switchTypeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_BOARDS_SWITCH_TYPE); + + for (int i = 0; i < SWITCH_TYPE_COUNT; i++) { + mdl->appendToItemList(switchTypeToString(i), i, true, 0, (i < SWITCH_3POS ? SwitchTypeFlag2Pos : SwitchTypeFlag3Pos)); + } + + mdl->loadItemList(); + return mdl; +} diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index e55aeae37..33ac887d9 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -18,13 +18,19 @@ * GNU General Public License for more details. */ -#ifndef _BOARDS_H_ -#define _BOARDS_H_ +#pragma once #include #include #include +class AbstractStaticItemModel; + +// identiying names of static abstract item models +constexpr char AIM_BOARDS_POT_TYPE[] {"boards.pottype"}; +constexpr char AIM_BOARDS_SLIDER_TYPE[] {"boards.slidertype"}; +constexpr char AIM_BOARDS_SWITCH_TYPE[] {"boards.switchtype"}; + // TODO create a Board class with all these functions namespace Board { @@ -64,13 +70,15 @@ namespace Board { POT_NONE, POT_WITH_DETENT, POT_MULTIPOS_SWITCH, - POT_WITHOUT_DETENT + POT_WITHOUT_DETENT, + POT_TYPE_COUNT }; enum SliderType { SLIDER_NONE, - SLIDER_WITH_DETENT + SLIDER_WITH_DETENT, + SLIDER_TYPE_COUNT }; enum SwitchType @@ -78,7 +86,8 @@ namespace Board { SWITCH_NOT_AVAILABLE, SWITCH_TOGGLE, SWITCH_2POS, - SWITCH_3POS + SWITCH_3POS, + SWITCH_TYPE_COUNT }; enum StickAxes { @@ -130,7 +139,8 @@ namespace Board { SwitchPositions, FactoryInstalledSwitches, NumTrims, - NumTrimSwitches + NumTrimSwitches, + HasRTC }; struct SwitchInfo @@ -149,6 +159,13 @@ namespace Board { unsigned int position; }; + enum SwitchTypeMasks { + SwitchTypeFlag2Pos = 0x01, + SwitchTypeFlag3Pos = 0x02, + SwitchTypeContext2Pos = SwitchTypeFlag2Pos, + SwitchTypeContext3Pos = SwitchTypeFlag2Pos | SwitchTypeFlag3Pos + }; + } class Boards @@ -182,6 +199,12 @@ class Boards static QString getAnalogInputName(Board::Type board, int index); static bool isBoardCompatible(Board::Type board1, Board::Type board2); static QString getBoardName(Board::Type board); + static QString potTypeToString(int value); + static QString sliderTypeToString(int value); + static QString switchTypeToString(int value); + static AbstractStaticItemModel * potTypeItemModel(); + static AbstractStaticItemModel * sliderTypeItemModel(); + static AbstractStaticItemModel * switchTypeItemModel(); protected: @@ -361,5 +384,3 @@ inline bool IS_ACCESS_RADIO(Board::Type board, const QString & id) return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) || (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess"))); } - -#endif // _BOARDS_H_ diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index 6cd62f287..00980339c 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -134,7 +134,6 @@ enum Capability { VirtualInputs, InputsLength, TrainerInputs, - RtcTime, SportTelemetry, LuaScripts, LuaInputsPerScript, @@ -153,7 +152,13 @@ enum Capability { HasSwitchableJack, HasSportConnector, PwrButtonPress, - Sensors + Sensors, + HasAuxSerialMode, + HasAux2SerialMode, + HasBluetooth, + HasAntennaChoice, + HasADCJitterFilter, + HasTelemetryBaudrate }; class EEPROMInterface diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index f9df851b2..d1575d3e2 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -23,6 +23,7 @@ #include "appdata.h" #include "eeprominterface.h" #include "radiodataconversionstate.h" +#include "compounditemmodels.h" const uint8_t chout_ar[] = { // First number is 0..23 -> template setup, Second is relevant channel out 1,2,3,4 , 1,2,4,3 , 1,3,2,4 , 1,3,4,2 , 1,4,2,3 , 1,4,3,2, @@ -36,7 +37,7 @@ bool GeneralSettings::switchPositionAllowedTaranis(int index) const if (index == 0) return true; - div_t qr = div(abs(index)-1, 3); + div_t qr = div(abs(index) - 1, 3); if (index < 0 && switchConfig[qr.quot] != Board::SWITCH_3POS) return false; @@ -53,14 +54,14 @@ bool GeneralSettings::switchSourceAllowedTaranis(int index) const bool GeneralSettings::isPotAvailable(int index) const { - if (index < 0 || index > getBoardCapability(getCurrentBoard(), Board::Pots)) + if (index < 0 || index > Boards::getCapability(getCurrentBoard(), Board::Pots)) return false; return potConfig[index] != Board::POT_NONE; } bool GeneralSettings::isSliderAvailable(int index) const { - if (index < 0 || index > getBoardCapability(getCurrentBoard(), Board::Sliders)) + if (index < 0 || index > Boards::getCapability(getCurrentBoard(), Board::Sliders)) return false; return sliderConfig[index] != Board::SLIDER_NONE; } @@ -71,7 +72,7 @@ GeneralSettings::GeneralSettings() contrast = 25; - for (int i=0; i < CPN_MAX_ANALOGS; ++i) { + for (int i = 0; i < CPN_MAX_ANALOGS; ++i) { calibMid[i] = 0x200; calibSpanNeg[i] = 0x180; calibSpanPos[i] = 0x180; @@ -128,7 +129,7 @@ GeneralSettings::GeneralSettings() } for (uint8_t i = 0; i < 4; i++) { - trainer.mix[i].mode = 2; // replace (:=) + trainer.mix[i].mode = TrainerMix::TRN_MIX_MODE_SUBST; trainer.mix[i].src = i; trainer.mix[i].weight = 100; } @@ -387,3 +388,265 @@ void GeneralSettings::convert(RadioDataConversionState & cstate) } } + +QString GeneralSettings::antennaModeToString() const +{ + return antennaModeToString(antennaMode); +} + +QString GeneralSettings::bluetoothModeToString() const +{ + return bluetoothModeToString(bluetoothMode); +} + +QString GeneralSettings::auxSerialModeToString() const +{ + return auxSerialModeToString(auxSerialMode); +} + +QString GeneralSettings::telemetryBaudrateToString() const +{ + return telemetryBaudrateToString(telemetryBaudrate); +} + +// static +QString GeneralSettings::antennaModeToString(int value) +{ + Board::Type board = getCurrentBoard(); + + switch(value) { + case ANTENNA_MODE_INTERNAL: + return tr("Internal"); + case ANTENNA_MODE_ASK: + return tr("Ask"); + case ANTENNA_MODE_PER_MODEL: + return tr("Per model"); + case ANTENNA_MODE_EXTERNAL: + // case ANTENNA_MODE_INTERNAL_EXTERNAL: + return IS_HORUS_X12S(board) ? tr("Internal + External") : tr("External"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +QString GeneralSettings::bluetoothModeToString(int value) +{ + Board::Type board = getCurrentBoard(); + + switch(value) { + case BLUETOOTH_MODE_OFF: + return tr("OFF"); + case BLUETOOTH_MODE_ENABLED: + // case BLUETOOTH_MODE_TELEMETRY: + return IS_TARANIS_X9E(board) ? tr("Enabled") : tr("Telemetry"); + case BLUETOOTH_MODE_TRAINER: + return tr("Trainer"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +QString GeneralSettings::auxSerialModeToString(int value) +{ + switch(value) { + case AUX_SERIAL_OFF: + return tr("OFF"); + case AUX_SERIAL_TELE_MIRROR: + return tr("Telemetry Mirror"); + case AUX_SERIAL_TELE_IN: + return tr("Telemetry In"); + case AUX_SERIAL_SBUS_TRAINER: + return tr("SBUS Trainer"); + case AUX_SERIAL_LUA: + return tr("LUA"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +QString GeneralSettings::telemetryBaudrateToString(int value) +{ + switch(value) { + case 0: + return "400000"; + case 1: + return "115200"; + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +FieldRange GeneralSettings::getPPM_MultiplierRange() +{ + FieldRange result; + + result.min = 0; + result.max = 5; + result.decimals = 1; + result.step = 0.1; + result.offset = 10; + + return result; +} + +// static +FieldRange GeneralSettings::getTxVoltageCalibrationRange() +{ + FieldRange result; + + result.decimals = 1; + result.max = 9.9; + result.min = -result.max; + result.step = 0.1; + result.unit = tr("v"); + + return result; +} + +// static +FieldRange GeneralSettings::getTxCurrentCalibration() +{ + FieldRange result; + + result.max = 49; + result.min = -result.max; + result.unit = tr("mA"); + + return result; +} + +// static +AbstractStaticItemModel * GeneralSettings::antennaModeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_GS_ANTENNAMODE); + + for (int i = ANTENNA_MODE_FIRST; i <= ANTENNA_MODE_LAST; i++) { + mdl->appendToItemList(antennaModeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +// static +AbstractStaticItemModel * GeneralSettings::bluetoothModeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_GS_BLUETOOTHMODE); + + for (int i = 0; i < BLUETOOTH_MODE_COUNT; i++) { + mdl->appendToItemList(bluetoothModeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +// static +AbstractStaticItemModel * GeneralSettings::auxSerialModeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_GS_AUXSERIALMODE); + + for (int i = 0; i < AUX_SERIAL_COUNT; i++) { + mdl->appendToItemList(auxSerialModeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +// static +AbstractStaticItemModel * GeneralSettings::telemetryBaudrateItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_GS_TELEMETRYBAUDRATE); + + for (int i = 0; i <= 1; i++) { + mdl->appendToItemList(telemetryBaudrateToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +/* + TrainerMix +*/ + +QString TrainerMix::modeToString() const +{ + return modeToString(mode); +} + +QString TrainerMix::srcToString() const +{ + return srcToString(src); +} + +// static +FieldRange TrainerMix::getWeightRange() +{ + FieldRange result; + + result.decimals = 0; + result.max = 125; + result.min = -result.max; + result.step = 1; + + return result; +} + +// static +QString TrainerMix::modeToString(int value) +{ + switch(value) { + case TRN_MIX_MODE_OFF: + return tr("OFF"); + case TRN_MIX_MODE_ADD: + return tr("+= (Sum)"); + case TRN_MIX_MODE_SUBST: + return tr(":= (Replace)"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +QString TrainerMix::srcToString(int value) +{ + return tr("CH%1").arg(value + 1); +} + +// static +AbstractStaticItemModel * TrainerMix::modeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_TRAINERMIX_MODE); + + for (int i = 0; i < TRN_MIX_MODE_COUNT; i++) { + mdl->appendToItemList(modeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} + +// static +AbstractStaticItemModel * TrainerMix::srcItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_TRAINERMIX_SRC); + + for (int i = 0; i < Boards::getCapability(getCurrentBoard(), Board::Sticks); i++) { + mdl->appendToItemList(srcToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index f7b28931d..466d630af 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -18,13 +18,13 @@ * GNU General Public License for more details. */ -#ifndef GENERALSETTINGS_H -#define GENERALSETTINGS_H +#pragma once #include "boards.h" #include "constants.h" #include "customfunctiondata.h" #include "rawsource.h" +#include "datahelpers.h" #include @@ -32,6 +32,15 @@ class Firmware; class ModelData; class GeneralSettings; class RadioDataConversionState; +class AbstractStaticItemModel; + +// identiying names of static abstract item models +constexpr char AIM_GS_ANTENNAMODE[] {"gs.antennamode"}; +constexpr char AIM_GS_BLUETOOTHMODE[] {"gs.bluetoothmode"}; +constexpr char AIM_GS_AUXSERIALMODE[] {"gs.auxserialmode"}; +constexpr char AIM_GS_TELEMETRYBAUDRATE[] {"gs.telemetrybaudrate"}; +constexpr char AIM_TRAINERMIX_MODE[] {"trainermix.mode"}; +constexpr char AIM_TRAINERMIX_SRC[] {"trainermix.src"}; enum UartModes { UART_MODE_NONE, @@ -42,23 +51,52 @@ enum UartModes { }; class TrainerMix { + Q_DECLARE_TR_FUNCTIONS(TrainerMix) + public: + enum TrainerMixModes { + TRN_MIX_MODE_OFF, + TRN_MIX_MODE_ADD, + TRN_MIX_MODE_SUBST, + TRN_MIX_MODE_COUNT + }; + TrainerMix() { clear(); } + unsigned int src; // 0-7 = ch1-8 RawSwitch swtch; int weight; unsigned int mode; // off, add-mode, subst-mode + void clear() { memset(reinterpret_cast(this), 0, sizeof(TrainerMix)); } + QString modeToString() const; + QString srcToString() const; + + static FieldRange getWeightRange(); + static QString modeToString(int value); + static QString srcToString(int value); + static AbstractStaticItemModel * modeItemModel(); + static AbstractStaticItemModel * srcItemModel(); }; class TrainerData { public: TrainerData() { clear(); } - int calib[4]; - TrainerMix mix[4]; + + int calib[4]; + TrainerMix mix[4]; + void clear() { memset(reinterpret_cast(this), 0, sizeof(TrainerData)); } }; +constexpr int CURR_MODEL_FILENAME_LEN {16}; +constexpr int OWNER_NAME_LEN {10}; +constexpr int BLUETOOTH_NAME_LEN {10}; +constexpr int TTS_LANGUAGE_LEN {2}; +constexpr int HARDWARE_NAME_LEN {3}; +constexpr int THEME_NAME_LEN {8}; +constexpr int REGISTRATION_ID_LEN {8}; + class GeneralSettings { Q_DECLARE_TR_FUNCTIONS(GeneralSettings) @@ -71,6 +109,36 @@ class GeneralSettings { BEEPER_ALL = 1 }; + enum BluetoothMode { + BLUETOOTH_MODE_OFF, + BLUETOOTH_MODE_ENABLED, + BLUETOOTH_MODE_TELEMETRY = BLUETOOTH_MODE_ENABLED, + BLUETOOTH_MODE_TRAINER, + BLUETOOTH_MODE_COUNT + }; + + enum AntennaMode { + ANTENNA_MODE_INTERNAL = -2, + ANTENNA_MODE_FIRST = ANTENNA_MODE_INTERNAL, + ANTENNA_MODE_ASK, + ANTENNA_MODE_PER_MODEL, + ANTENNA_MODE_EXTERNAL, + ANTENNA_MODE_INTERNAL_EXTERNAL = ANTENNA_MODE_EXTERNAL, + ANTENNA_MODE_LAST = ANTENNA_MODE_INTERNAL_EXTERNAL + }; + + enum AuxSerialMode { + AUX_SERIAL_OFF, + AUX_SERIAL_TELE_MIRROR, + AUX_SERIAL_TELE_IN, + AUX_SERIAL_SBUS_TRAINER, + AUX_SERIAL_LUA, + AUX_SERIAL_COUNT + }; + + enum TelemetryBaudrate { + }; + GeneralSettings(); void convert(RadioDataConversionState & cstate); @@ -81,61 +149,61 @@ class GeneralSettings { unsigned int version; unsigned int variant; - int calibMid[CPN_MAX_ANALOGS]; - int calibSpanNeg[CPN_MAX_ANALOGS]; - int calibSpanPos[CPN_MAX_ANALOGS]; - unsigned int currModelIndex; - char currModelFilename[16+1]; - unsigned int contrast; - unsigned int vBatWarn; - int txVoltageCalibration; - int txCurrentCalibration; - int vBatMin; - int vBatMax; - int backlightMode; + int calibMid[CPN_MAX_ANALOGS]; + int calibSpanNeg[CPN_MAX_ANALOGS]; + int calibSpanPos[CPN_MAX_ANALOGS]; + unsigned int currModelIndex; + char currModelFilename[CURR_MODEL_FILENAME_LEN + 1]; + unsigned int contrast; + unsigned int vBatWarn; + int txVoltageCalibration; + int txCurrentCalibration; + int vBatMin; + int vBatMax; + int backlightMode; TrainerData trainer; - unsigned int view; // main screen view // TODO enum - bool disableThrottleWarning; - bool fai; - bool disableMemoryWarning; + unsigned int view; // main screen view // TODO enum + bool disableThrottleWarning; + bool fai; + bool disableMemoryWarning; BeeperMode beeperMode; - bool disableAlarmWarning; - bool disableRssiPoweroffAlarm; - unsigned int usbMode; - unsigned int jackMode; - bool sportPower; + bool disableAlarmWarning; + bool disableRssiPoweroffAlarm; + unsigned int usbMode; + unsigned int jackMode; + bool sportPower; BeeperMode hapticMode; - unsigned int stickMode; // TODO enum - int timezone; - bool adjustRTC; - bool optrexDisplay; - unsigned int inactivityTimer; - unsigned int telemetryBaudrate; - bool minuteBeep; - bool preBeep; - bool flashBeep; - unsigned int splashMode; + unsigned int stickMode; // TODO enum + int timezone; + bool adjustRTC; + bool optrexDisplay; + unsigned int inactivityTimer; + unsigned int telemetryBaudrate; + bool minuteBeep; + bool preBeep; + bool flashBeep; + unsigned int splashMode; int splashDuration; - unsigned int backlightDelay; - unsigned int templateSetup; //RETA order according to chout_ar array - int PPM_Multiplier; - int hapticLength; - unsigned int reNavigation; + unsigned int backlightDelay; + unsigned int templateSetup; //RETA order according to chout_ar array + int PPM_Multiplier; + int hapticLength; + unsigned int reNavigation; unsigned int stickReverse; - unsigned int speakerPitch; - int hapticStrength; - unsigned int speakerMode; - char ownerName[10+1]; - int beeperLength; - unsigned int gpsFormat; - int speakerVolume; - unsigned int backlightBright; - unsigned int backlightOffBright; + unsigned int speakerPitch; + int hapticStrength; + unsigned int speakerMode; + char ownerName[OWNER_NAME_LEN + 1]; + int beeperLength; + unsigned int gpsFormat; + int speakerVolume; + unsigned int backlightBright; + unsigned int backlightOffBright; int switchesDelay; unsigned int mAhWarn; unsigned int mAhUsed; unsigned int globalTimer; - char bluetoothName[10+1]; + char bluetoothName[BLUETOOTH_NAME_LEN + 1]; unsigned int bluetoothBaudrate; unsigned int bluetoothMode; unsigned int sticksGain; @@ -145,7 +213,7 @@ class GeneralSettings { bool rtcCheckDisable; bool keysBacklight; unsigned int imperial; - char ttsLanguage[2+1]; + char ttsLanguage[TTS_LANGUAGE_LEN + 1]; int beepVolume; int wavVolume; int varioVolume; @@ -156,33 +224,47 @@ class GeneralSettings { unsigned int mavbaud; unsigned int switchUnlockStates; unsigned int auxSerialMode; + unsigned int aux2SerialMode; int antennaMode; unsigned int backlightColor; CustomFunctionData customFn[CPN_MAX_SPECIAL_FUNCTIONS]; - char switchName[CPN_MAX_SWITCHES][3+1]; + char switchName[CPN_MAX_SWITCHES][HARDWARE_NAME_LEN + 1]; unsigned int switchConfig[CPN_MAX_SWITCHES]; - char stickName[CPN_MAX_STICKS][3+1]; - char potName[CPN_MAX_KNOBS][3+1]; + char stickName[CPN_MAX_STICKS][HARDWARE_NAME_LEN + 1]; + char potName[CPN_MAX_KNOBS][HARDWARE_NAME_LEN + 1]; unsigned int potConfig[CPN_MAX_KNOBS]; - char sliderName[CPN_MAX_SLIDERS][3+1]; + char sliderName[CPN_MAX_SLIDERS][HARDWARE_NAME_LEN + 1]; unsigned int sliderConfig[CPN_MAX_SLIDERS]; - char themeName[8+1]; - typedef uint8_t ThemeOptionData[8+1]; + char themeName[THEME_NAME_LEN + 1]; + typedef uint8_t ThemeOptionData[8 + 1]; ThemeOptionData themeOptionValue[5]; - - char registrationId[8+1]; + + char registrationId[REGISTRATION_ID_LEN + 1]; int gyroMax; int gyroOffset; int pwrOnSpeed; int pwrOffSpeed; - + bool switchPositionAllowedTaranis(int index) const; bool switchSourceAllowedTaranis(int index) const; bool isPotAvailable(int index) const; bool isSliderAvailable(int index) const; + QString antennaModeToString() const; + QString bluetoothModeToString() const; + QString auxSerialModeToString() const; + QString telemetryBaudrateToString() const; + + static QString antennaModeToString(int value); + static QString bluetoothModeToString(int value); + static QString auxSerialModeToString(int value); + static QString telemetryBaudrateToString(int value); + static FieldRange getPPM_MultiplierRange(); + static FieldRange getTxVoltageCalibrationRange(); + static FieldRange getTxCurrentCalibration(); + static AbstractStaticItemModel * antennaModeItemModel(); + static AbstractStaticItemModel * bluetoothModeItemModel(); + static AbstractStaticItemModel * auxSerialModeItemModel(); + static AbstractStaticItemModel * telemetryBaudrateItemModel(); }; - - -#endif // GENERALSETTINGS_H diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index f9fc8c8f5..0304bc72d 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2759,7 +2759,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (version >= 218) { internalField.Append(new UnsignedField<4>(this, generalData.auxSerialMode)); if (IS_FAMILY_HORUS_OR_T16(board) && version >= 219) { - internalField.Append(new SpareBitsField<4>(this)); + internalField.Append(new UnsignedField<4>(this, generalData.aux2SerialMode)); } else { for (uint8_t i=0; i -#include -#include #include "calibration.h" - +#include "autospinbox.h" +#include "helpers.h" CalibrationPanel::CalibrationPanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware): GeneralPanel(parent, generalSettings, firmware) { + int rows = Boards::getCapability(getCurrentBoard(), Board::MaxAnalogs); - tableWidget = new QTableWidget(); - QVBoxLayout * layout = new QVBoxLayout(); - layout->addWidget(tableWidget); - layout->setContentsMargins(0, 0, 0, 0); - this->setLayout(layout); - - tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - tableWidget->setColumnCount(3); - tableWidget->setShowGrid(false); - tableWidget->setSelectionMode(QAbstractItemView::NoSelection); - tableWidget->setFrameStyle(QFrame::NoFrame | QFrame::Plain); - tableWidget->setStyleSheet("QTableWidget {background-color: transparent;}"); QStringList headerLabels; - headerLabels << tr("Negative span") << tr("Mid value") << tr("Positive span"); - tableWidget->setHorizontalHeaderLabels(headerLabels); + headerLabels << "" << tr("Negative span") << tr("Mid value") << tr("Positive span"); - int rows = getBoardCapability(getCurrentBoard(), Board::MaxAnalogs); - tableWidget->setRowCount(rows); + TableLayout * tableLayout = new TableLayout(this, rows, headerLabels); - for(int i = 0; i < rows; ++i) { + for (int i = 0; i < rows; i++) { + int col = 0; + QLabel * label = new QLabel(this); + label->setText(firmware->getAnalogInputName(i)); + tableLayout->addWidget(i, col++, label); - QTableWidgetItem *newItem = new QTableWidgetItem(firmware->getAnalogInputName(i)); - newItem->setTextAlignment(Qt::AlignLeft); - tableWidget->setVerticalHeaderItem(i, newItem); + QLineEdit * leNeg = new QLineEdit(this); + leNeg->setText(QString("%1").arg(generalSettings.calibSpanNeg[i])); + leNeg->setReadOnly(true); + tableLayout->addWidget(i, col++, leNeg); - for(int j = 0; j < 3; ++j) { - QSpinBox * newItem = new QSpinBox(); - newItem->setMinimum(-9999); - newItem->setMaximum(9999); - newItem->setSingleStep(1); - newItem->setValue(getCalibrationValue(i, j)); - newItem->setProperty("row", i); - newItem->setProperty("column", j); - tableWidget->setCellWidget(i, j, newItem); - connect(newItem, SIGNAL(valueChanged(int)), this, SLOT(onCellChanged(int))); - } + QLineEdit * leMid = new QLineEdit(this); + leMid->setText(QString("%1").arg(generalSettings.calibMid[i])); + leMid->setReadOnly(true); + tableLayout->addWidget(i, col++, leMid); + + QLineEdit * lePos = new QLineEdit(this); + lePos->setText(QString("%1").arg(generalSettings.calibSpanPos[i])); + lePos->setReadOnly(true); + tableLayout->addWidget(i, col++, lePos); } + disableMouseScrolling(); -} - -void CalibrationPanel::onCellChanged(int value) -{ - QSpinBox * sb = qobject_cast(sender()); - int row = sb->property("row").toInt(); - int column = sb->property("column").toInt(); - - if (value != getCalibrationValue(row, column)) { - setCalibrationValue(row,column, value); - qDebug() << "CalibrationPanel::onCellChanged" << row << column << "to" << value; - emit modified(); - } -} - -int CalibrationPanel::getCalibrationValue(int row, int column) -{ - switch(column) { - case 0: - return generalSettings.calibSpanNeg[row]; - case 1: - return generalSettings.calibMid[row]; - case 2: - return generalSettings.calibSpanPos[row]; - } - return 0; -} - -void CalibrationPanel::setCalibrationValue(int row, int column, int value) -{ - switch(column) { - case 0: - generalSettings.calibSpanNeg[row] = value; - break; - case 1: - generalSettings.calibMid[row] = value; - break; - case 2: - generalSettings.calibSpanPos[row] = value; - break; - } + tableLayout->resizeColumnsToContents(); + tableLayout->setColumnWidth(0, QString(15, ' ')); + tableLayout->pushColumnsLeft(headerLabels.count()); + tableLayout->pushRowsUp(rows + 1); } diff --git a/companion/src/generaledit/calibration.h b/companion/src/generaledit/calibration.h index fd28e492b..279b7cf80 100644 --- a/companion/src/generaledit/calibration.h +++ b/companion/src/generaledit/calibration.h @@ -18,20 +18,10 @@ * GNU General Public License for more details. */ -#ifndef _CALIBRATION_H_ -#define _CALIBRATION_H_ +#pragma once -#include #include "generaledit.h" -namespace Ui { - class Calibration; -} - -class QLabel; -class AutoLineEdit; -class AutoComboBox; - class CalibrationPanel : public GeneralPanel { Q_OBJECT @@ -40,14 +30,5 @@ class CalibrationPanel : public GeneralPanel CalibrationPanel(QWidget *parent, GeneralSettings & generalSettings, Firmware * firmware); virtual ~CalibrationPanel() {}; - private slots: - void onCellChanged(int value); - private: - QTableWidget * tableWidget; - - int getCalibrationValue(int row, int column); - void setCalibrationValue(int row, int column, int value); }; - -#endif // _CALIBRATION_H_ diff --git a/companion/src/generaledit/generaledit.cpp b/companion/src/generaledit/generaledit.cpp index e80038f9f..99884ed43 100644 --- a/companion/src/generaledit/generaledit.cpp +++ b/companion/src/generaledit/generaledit.cpp @@ -46,26 +46,27 @@ GeneralEdit::GeneralEdit(QWidget * parent, RadioData & radioData, Firmware * fir } ui->profile_CB->clear(); - for (int i=0; iprofile_CB->addItem(name, i); - if (i==g.id()) { - ui->profile_CB->setCurrentIndex(ui->profile_CB->count()-1); + if (i == g.id()) { + ui->profile_CB->setCurrentIndex(ui->profile_CB->count() - 1); } } } - sharedItemModels = new CompoundItemModelFactory(&generalSettings, nullptr); - sharedItemModels->addItemModel(AbstractItemModel::IMID_RawSource); - sharedItemModels->addItemModel(AbstractItemModel::IMID_RawSwitch); - sharedItemModels->addItemModel(AbstractItemModel::IMID_CustomFuncAction); - sharedItemModels->addItemModel(AbstractItemModel::IMID_CustomFuncResetParam); + editorItemModels = new CompoundItemModelFactory(&generalSettings, nullptr); + // tabs created below expect these item models to be pre-registered + editorItemModels->addItemModel(AbstractItemModel::IMID_RawSource); + editorItemModels->addItemModel(AbstractItemModel::IMID_RawSwitch); + editorItemModels->addItemModel(AbstractItemModel::IMID_CustomFuncAction); + editorItemModels->addItemModel(AbstractItemModel::IMID_CustomFuncResetParam); addTab(new GeneralSetupPanel(this, generalSettings, firmware), tr("Setup")); - addTab(new CustomFunctionsPanel(this, nullptr, generalSettings, firmware, sharedItemModels), tr("Global Functions")); - addTab(new TrainerPanel(this, generalSettings, firmware), tr("Trainer")); - addTab(new HardwarePanel(this, generalSettings, firmware), tr("Hardware")); + addTab(new CustomFunctionsPanel(this, nullptr, generalSettings, firmware, editorItemModels), tr("Global Functions")); + addTab(new TrainerPanel(this, generalSettings, firmware, editorItemModels), tr("Trainer")); + addTab(new HardwarePanel(this, generalSettings, firmware, editorItemModels), tr("Hardware")); addTab(new CalibrationPanel(this, generalSettings, firmware), tr("Calibration")); ui->tabWidget->setCurrentIndex( g.generalEditTab() ); @@ -74,7 +75,7 @@ GeneralEdit::GeneralEdit(QWidget * parent, RadioData & radioData, Firmware * fir GeneralEdit::~GeneralEdit() { delete ui; - delete sharedItemModels; + delete editorItemModels; // cleans up item models registered by the tabs } void GeneralEdit::closeEvent(QCloseEvent *event) @@ -90,7 +91,7 @@ void GeneralEdit::addTab(GenericPanel *panel, QString text) VerticalScrollArea * area = new VerticalScrollArea(widget, panel); baseLayout->addWidget(area); ui->tabWidget->addTab(widget, text); - connect(panel, SIGNAL(modified()), this, SLOT(onTabModified())); + connect(panel, &GenericPanel::modified, this, &GeneralEdit::onTabModified); } void GeneralEdit::onTabModified() diff --git a/companion/src/generaledit/generaledit.h b/companion/src/generaledit/generaledit.h index b2e6caa82..2ad27cb1c 100644 --- a/companion/src/generaledit/generaledit.h +++ b/companion/src/generaledit/generaledit.h @@ -18,8 +18,7 @@ * GNU General Public License for more details. */ -#ifndef _GENERALEDIT_H_ -#define _GENERALEDIT_H_ +#pragma once #include #include "eeprominterface.h" @@ -35,7 +34,7 @@ class GeneralPanel : public GenericPanel { public: GeneralPanel(QWidget *parent, GeneralSettings & generalSettings, Firmware * firmware): - GenericPanel(parent, NULL, generalSettings, firmware) + GenericPanel(parent, nullptr, generalSettings, firmware) { } }; @@ -73,7 +72,5 @@ class GeneralEdit : public QDialog QVector panels; void addTab(GenericPanel *panel, QString text); void closeEvent(QCloseEvent *event); - CompoundItemModelFactory *sharedItemModels; + CompoundItemModelFactory *editorItemModels; }; - -#endif // _GENERALEDIT_H_ diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index 9d2e8e452..4f7e52a7a 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -19,326 +19,268 @@ */ #include "hardware.h" -#include "ui_hardware.h" +#include "compounditemmodels.h" +#include "filtereditemmodels.h" +#include "autolineedit.h" +#include "autocombobox.h" +#include "autocheckbox.h" +#include "autospinbox.h" +#include "autodoublespinbox.h" -void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos) -{ - Board::Type board = getCurrentBoard(); - if (IS_STM32(board) && index < getBoardCapability(board, Board::Switches)) { - type->addItem(tr("None"), Board::SWITCH_NOT_AVAILABLE); - type->addItem(tr("2 Positions Toggle"), Board::SWITCH_TOGGLE); - type->addItem(tr("2 Positions"), Board::SWITCH_2POS); - if (threePos) { - type->addItem(tr("3 Positions"), Board::SWITCH_3POS); - } - name->setField(generalSettings.switchName[index], 3, this); - type->setField(generalSettings.switchConfig[index], this); - if (IS_TARANIS_X7(board)) { - if (index == 4) { - label->setText("SF"); - } - else if (index == 5) { - label->setText("SH"); - } - if (index == 6) { - label->setText("SI"); - } - else if (index == 7) { - label->setText("SJ"); - } - } - else if (IS_RADIOMASTER_TX12(board)) { - if (index == 6) { - label->setText("SI"); - } - else if (index == 7) { - label->setText("SJ"); - } - } - else if (IS_FAMILY_T12(board)) { - if (index == 4) { - label->setText("SG"); - } - else if (index == 5) { - label->setText("SH"); - } - } - } - else { - label->hide(); - name->hide(); - type->hide(); - } -} +#include +#include +#include -void HardwarePanel::setupPotType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type) -{ - Board::Type board = firmware->getBoard(); +constexpr char FIM_SWITCHTYPE2POS[] {"Switch Type 2 Pos"}; +constexpr char FIM_SWITCHTYPE3POS[] {"Switch Type 3 Pos"}; - if (IS_STM32(board) && index < getBoardCapability(board, Board::Pots)) { - label->setText(RawSource(SOURCE_TYPE_STICK, CPN_MAX_STICKS+index).toString()); - type->addItem(tr("None"), Board::POT_NONE); - type->addItem(tr("Pot with detent"), Board::POT_WITH_DETENT); - type->addItem(tr("Multipos switch"), Board::POT_MULTIPOS_SWITCH); - type->addItem(tr("Pot without detent"), Board::POT_WITHOUT_DETENT); - name->setField(generalSettings.potName[index], 3, this); - type->setField(generalSettings.potConfig[index], this); - } - else { - label->hide(); - name->hide(); - type->hide(); - } -} - -void HardwarePanel::setupSliderType(int index, QLabel *label, AutoLineEdit *name, AutoComboBox *type) -{ - Board::Type board = firmware->getBoard(); - - if (IS_STM32(board) && index < getBoardCapability(board, Board::Sliders)) { - label->setText(RawSource(SOURCE_TYPE_STICK, CPN_MAX_STICKS+getBoardCapability(board, Board::Pots)+index).toString()); - type->addItem(tr("None"), Board::SLIDER_NONE); - type->addItem(tr("Slider with detent"), Board::SLIDER_WITH_DETENT); - name->setField(generalSettings.sliderName[index], 3, this); - type->setField(generalSettings.sliderConfig[index], this); - } - else { - label->hide(); - name->hide(); - type->hide(); - } -} - -bool HardwarePanel::isSwitch3Pos(int idx) -{ - Board::Type board = firmware->getBoard(); - Board::SwitchInfo switchInfo = Boards::getSwitchInfo(board, idx); - - switchInfo.config = Board::SwitchType(generalSettings.switchConfig[idx]); - return switchInfo.config == Board::SWITCH_3POS; -}; - -HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware): +HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware, CompoundItemModelFactory * sharedItemModels): GeneralPanel(parent, generalSettings, firmware), - ui(new Ui::Hardware) + board(firmware->getBoard()), + editorItemModels(sharedItemModels) { - ui->setupUi(this); + editorItemModels->registerItemModel(Boards::potTypeItemModel()); + editorItemModels->registerItemModel(Boards::sliderTypeItemModel()); + int id = editorItemModels->registerItemModel(Boards::switchTypeItemModel()); - Board::Type board = firmware->getBoard(); + tabFilteredModels = new FilteredItemModelFactory(); + tabFilteredModels->registerItemModel(new FilteredItemModel(editorItemModels->getItemModel(id), Board::SwitchTypeContext2Pos), FIM_SWITCHTYPE2POS); + tabFilteredModels->registerItemModel(new FilteredItemModel(editorItemModels->getItemModel(id), Board::SwitchTypeContext3Pos), FIM_SWITCHTYPE3POS); - if (IS_STM32(board)) { - ui->rudName->setField(generalSettings.stickName[0], 3, this); - ui->eleName->setField(generalSettings.stickName[1], 3, this); - ui->thrName->setField(generalSettings.stickName[2], 3, this); - ui->ailName->setField(generalSettings.stickName[3], 3, this); + int antmodelid = editorItemModels->registerItemModel(GeneralSettings::antennaModeItemModel()); + int btmodelid = editorItemModels->registerItemModel(GeneralSettings::bluetoothModeItemModel()); + int auxmodelid = editorItemModels->registerItemModel(GeneralSettings::auxSerialModeItemModel()); + int baudmodelid = editorItemModels->registerItemModel(GeneralSettings::telemetryBaudrateItemModel()); + + grid = new QGridLayout(this); + int count; + int row = 0; + + count = Boards::getCapability(board, Board::Sticks); + if (count) { + for (int i = 0; i < count; i++) { + addStick(i, row); + } } - else { - ui->rudLabel->hide(); - ui->rudName->hide(); - ui->eleLabel->hide(); - ui->eleName->hide(); - ui->thrLabel->hide(); - ui->thrName->hide(); - ui->ailLabel->hide(); - ui->ailName->hide(); - ui->potsTypeSeparator_1->hide(); - ui->potsTypeSeparator_2->hide(); + + count = Boards::getCapability(board, Board::Pots); + if (count) { + for (int i = 0; i < count; i++) { + addPot(i, row); + } } - + + count = Boards::getCapability(board, Board::Sliders); + if (count) { + for (int i = 0; i < count; i++) { + addSlider(i, row); + } + addLine(row); + } + + count = Boards::getCapability(board, Board::Switches); + if (count) { + for (int i = 0; i < count; i++) { + addSwitch(i, row); + } + addLine(row); + } + + addLabel(tr("Battery Offset"), row, 0); + AutoDoubleSpinBox *txVoltageCalibration = new AutoDoubleSpinBox(this); + FieldRange txVCRng = GeneralSettings::getTxVoltageCalibrationRange(); + txVoltageCalibration->setDecimals(txVCRng.decimals); + txVoltageCalibration->setSingleStep(txVCRng.step); + txVoltageCalibration->setSuffix(txVCRng.unit); + txVoltageCalibration->setField(generalSettings.txVoltageCalibration); + addParams(row, txVoltageCalibration); + + if (Boards::getCapability(board, Board::HasRTC)) { + addLabel(tr("RTC Battery Check"), row, 0); + AutoCheckBox *rtcCheckDisable = new AutoCheckBox(this); + rtcCheckDisable->setField(generalSettings.rtcCheckDisable, this, true); + addParams(row, rtcCheckDisable); + } + + if (firmware->getCapability(HasBluetooth)) { + addLabel(tr("Bluetooth"), row, 0); + + QGridLayout *btlayout = new QGridLayout(); + + AutoComboBox *bluetoothMode = new AutoComboBox(this); + bluetoothMode->setModel(editorItemModels->getItemModel(btmodelid)); + bluetoothMode->setField(generalSettings.bluetoothMode, this); + btlayout->addWidget(bluetoothMode, 0, 0); + + QSpacerItem * spacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ); + btlayout->addItem(spacer, 0, 1); + + QLabel *btnamelabel = new QLabel(this); + btnamelabel->setText(tr("Device Name:")); + btlayout->addWidget(btnamelabel, 0, 2); + + AutoLineEdit *bluetoothName = new AutoLineEdit(this); + bluetoothName->setField(generalSettings.bluetoothName, BLUETOOTH_NAME_LEN, this); + btlayout->addWidget(bluetoothName, 0, 3); + + grid->addLayout(btlayout, row, 1); + row++; + } + + if (firmware->getCapability(HasAntennaChoice)) { + addLabel(tr("Antenna"), row, 0); + AutoComboBox *antennaMode = new AutoComboBox(this); + antennaMode->setModel(editorItemModels->getItemModel(antmodelid)); + antennaMode->setField(generalSettings.antennaMode, this); + addParams(row, antennaMode); + } + + if (firmware->getCapability(HasAuxSerialMode)) { + QString lbl = "Serial Port"; + if (IS_RADIOMASTER_TX16S(board)) + lbl.append(" (TTL)"); + addLabel(tr("%1").arg(lbl), row, 0); + AutoComboBox *serialPortMode = new AutoComboBox(this); + serialPortMode->setModel(editorItemModels->getItemModel(auxmodelid)); + serialPortMode->setField(generalSettings.auxSerialMode); + addParams(row, serialPortMode); + } + + if (firmware->getCapability(HasAux2SerialMode)) { + QString lbl = "Serial Port 2"; + if (IS_RADIOMASTER_TX16S(board)) + lbl.append(" (TTL)"); + addLabel(tr("%1").arg(lbl), row, 0); + AutoComboBox *serialPort2Mode = new AutoComboBox(this); + serialPort2Mode->setModel(editorItemModels->getItemModel(auxmodelid)); + serialPort2Mode->setField(generalSettings.aux2SerialMode); + addParams(row, serialPort2Mode); + } + + if (firmware->getCapability(HasADCJitterFilter)) { + addLabel(tr("ADC Filter"), row, 0); + AutoCheckBox *filterEnable = new AutoCheckBox(this); + filterEnable->setField(generalSettings.jitterFilter, this, true); + addParams(row, filterEnable); + } + if (firmware->getCapability(HasSportConnector)) { - ui->sportPower->setChecked(generalSettings.sportPower); - } - else { - ui->sportPower->hide(); - ui->sportPowerLabel->hide(); + addLabel(tr("S.Port Power"), row, 0); + AutoCheckBox *sportPower = new AutoCheckBox(this); + sportPower->setField(generalSettings.sportPower, this); + addParams(row, sportPower); } - setupPotType(0, ui->pot1Label, ui->pot1Name, ui->pot1Type); - setupPotType(1, ui->pot2Label, ui->pot2Name, ui->pot2Type); - setupPotType(2, ui->pot3Label, ui->pot3Name, ui->pot3Type); - setupPotType(3, ui->pot4Label, ui->pot4Name, ui->pot4Type); - setupPotType(4, ui->pot5Label, ui->pot5Name, ui->pot5Type); - - setupSliderType(0, ui->lsLabel, ui->lsName, ui->lsType); - setupSliderType(1, ui->rsLabel, ui->rsName, ui->rsType); - setupSliderType(2, ui->ls2Label, ui->ls2Name, ui->ls2Type); - setupSliderType(3, ui->rs2Label, ui->rs2Name, ui->rs2Type); - - setupSwitchType(0, ui->saLabel, ui->saName, ui->saType, isSwitch3Pos(0)); - setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType, isSwitch3Pos(1)); - setupSwitchType(2, ui->scLabel, ui->scName, ui->scType, isSwitch3Pos(2)); - setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType, isSwitch3Pos(3)); - setupSwitchType(4, ui->seLabel, ui->seName, ui->seType, isSwitch3Pos(4)); - setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, isSwitch3Pos(5)); - setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType, isSwitch3Pos(6)); - setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, isSwitch3Pos(7)); - setupSwitchType(8, ui->siLabel, ui->siName, ui->siType, isSwitch3Pos(8)); - setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType, isSwitch3Pos(9)); - setupSwitchType(10, ui->skLabel, ui->skName, ui->skType); // Here starts X9E, only 3 switches - setupSwitchType(11, ui->slLabel, ui->slName, ui->slType); - setupSwitchType(12, ui->smLabel, ui->smName, ui->smType); - setupSwitchType(13, ui->snLabel, ui->snName, ui->snType); - setupSwitchType(14, ui->soLabel, ui->soName, ui->soType); - setupSwitchType(15, ui->spLabel, ui->spName, ui->spType); - setupSwitchType(16, ui->sqLabel, ui->sqName, ui->sqType); - setupSwitchType(17, ui->srLabel, ui->srName, ui->srType); - - if (IS_TARANIS(board) && !IS_TARANIS_SMALL(board)) { - ui->serialPortMode->setCurrentIndex(generalSettings.auxSerialMode); - } - else { - ui->serialPortMode->setCurrentIndex(0); - ui->serialPortMode->hide(); - ui->serialPortLabel->hide(); + if (firmware->getCapability(HasTelemetryBaudrate)) { + addLabel(tr("Maximum Baud"), row, 0); + AutoComboBox *maxBaudRate = new AutoComboBox(this); + maxBaudRate->setModel(editorItemModels->getItemModel(baudmodelid)); + maxBaudRate->setField(generalSettings.telemetryBaudrate, this); + addParams(row, maxBaudRate); } - if (!IS_SKY9X(board)) { - ui->txCurrentCalibration->hide(); - ui->txCurrentCalibrationLabel->hide(); - } - - if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_TARANIS_X9DP_2019(board) || IS_FAMILY_HORUS_OR_T16(board)) { - ui->bluetoothMode->addItem(tr("OFF"), 0); - if (IS_TARANIS_X9E(board)) { - ui->bluetoothMode->addItem(tr("Enabled"), 1); - } - else { - ui->bluetoothMode->addItem(tr("Telemetry"), 1); - ui->bluetoothMode->addItem(tr("Trainer"), 2); - } - ui->bluetoothMode->setField(generalSettings.bluetoothMode, this); - ui->bluetoothName->setField(generalSettings.bluetoothName, 10, this); - } - else { - ui->bluetoothLabel->hide(); - ui->bluetoothWidget->hide(); - } - - if ((IS_FAMILY_HORUS_OR_T16(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))) { - ui->antennaMode->addItem(tr("Internal"), -2); - ui->antennaMode->addItem(tr("Ask"), -1); - ui->antennaMode->addItem(tr("Per model"), 0); - ui->antennaMode->addItem(IS_HORUS_X12S(board) ? tr("Internal + External") : tr("External"), 1); - ui->antennaMode->setField(generalSettings.antennaMode, this); - } - else { - ui->antennaLabel->hide(); - ui->antennaMode->hide(); - } - - if (IS_HORUS_OR_TARANIS(board)) { - ui->filterEnable->setChecked(!generalSettings.jitterFilter); - } - else { - ui->filterEnable->hide(); - ui->filterLabel->hide(); - } - - if (IS_STM32(board)) { - ui->rtcCheckDisable->setChecked(!generalSettings.rtcCheckDisable); - } - else { - ui->rtcCheckDisable->hide(); - ui->rtcCheckLabel->hide(); + if (firmware->getCapability(HastxCurrentCalibration)) { + addLabel(tr("Current Offset"), row, 0); + AutoSpinBox *txCurrentCalibration = new AutoSpinBox(this); + FieldRange txCCRng = GeneralSettings::getTxCurrentCalibration(); + txCurrentCalibration->setSuffix(txVCRng.unit); + txCurrentCalibration->setField(generalSettings.txCurrentCalibration); + addParams(row, txCurrentCalibration); } + addVSpring(grid, 0, grid->rowCount()); + addHSpring(grid, grid->columnCount(), 0); disableMouseScrolling(); - - setValues(); } HardwarePanel::~HardwarePanel() { - delete ui; + delete tabFilteredModels; } -void HardwarePanel::on_filterEnable_stateChanged() +void HardwarePanel::addStick(int index, int & row) { - generalSettings.jitterFilter = !ui->filterEnable->isChecked(); + int col = 0; + addLabel(Boards::getAnalogInputName(board, index), row, col++); + + AutoLineEdit *name = new AutoLineEdit(this); + name->setField(generalSettings.stickName[index], HARDWARE_NAME_LEN, this); + + addParams(row, name); } -void HardwarePanel::on_sportPower_stateChanged() +void HardwarePanel::addPot(int index, int & row) { - generalSettings.sportPower = ui->sportPower->isChecked(); + addLabel(Boards::getAnalogInputName(board, Boards::getCapability(board, Board::Sticks) + index), row, 0); + + AutoLineEdit *name = new AutoLineEdit(this); + name->setField(generalSettings.potName[index], HARDWARE_NAME_LEN, this); + + AutoComboBox *type = new AutoComboBox(this); + type->setModel(editorItemModels->getItemModel(AIM_BOARDS_POT_TYPE)); + type->setField(generalSettings.potConfig[index], this); + + addParams(row, name, type); } -void HardwarePanel::on_rtcCheckDisable_stateChanged() +void HardwarePanel::addSlider(int index, int & row) { - generalSettings.rtcCheckDisable = !ui->rtcCheckDisable->isChecked(); + addLabel(Boards::getAnalogInputName(board, Boards::getCapability(board, Board::Sticks) + + Boards::getCapability(board, Board::Pots) + index), row, 0); + + AutoLineEdit *name = new AutoLineEdit(this); + name->setField(generalSettings.sliderName[index], HARDWARE_NAME_LEN, this); + + AutoComboBox *type = new AutoComboBox(this); + type->setModel(editorItemModels->getItemModel(AIM_BOARDS_SLIDER_TYPE)); + type->setField(generalSettings.sliderConfig[index], this); + + addParams(row, name, type); } -void HardwarePanel::on_PPM_MultiplierDSB_editingFinished() +void HardwarePanel::addSwitch(int index, int & row) { - int val = (int)(ui->PPM_MultiplierDSB->value()*10)-10; - if (generalSettings.PPM_Multiplier != val) { - generalSettings.PPM_Multiplier = val; - emit modified(); - } + addLabel(Boards::getSwitchInfo(board, index).name, row, 0); + + AutoLineEdit *name = new AutoLineEdit(this); + name->setField(generalSettings.switchName[index], HARDWARE_NAME_LEN, this); + + AutoComboBox *type = new AutoComboBox(this); + Board::SwitchInfo switchInfo = Boards::getSwitchInfo(board, index); + type->setModel(switchInfo.config < Board::SWITCH_3POS ? tabFilteredModels->getItemModel(FIM_SWITCHTYPE2POS) : + tabFilteredModels->getItemModel(FIM_SWITCHTYPE3POS)); + type->setField(generalSettings.switchConfig[index], this); + + addParams(row, name, type); } -void HardwarePanel::on_PPM1_editingFinished() +void HardwarePanel::addLabel(QString text, int row, int col) { - if (generalSettings.trainer.calib[0] != ui->PPM1->value()) { - generalSettings.trainer.calib[0] = ui->PPM1->value(); - emit modified(); - } + QLabel *label = new QLabel(this); + label->setText(text); + grid->addWidget(label, row, col); } -void HardwarePanel::on_PPM2_editingFinished() +void HardwarePanel::addLine(int & row) { - if (generalSettings.trainer.calib[1] != ui->PPM2->value()) { - generalSettings.trainer.calib[1] = ui->PPM2->value(); - emit modified(); - } + QFrame *line = new QFrame(this); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + line->setLineWidth(1); + line->setMidLineWidth(0); + grid->addWidget(line, row, 0, 1, grid->columnCount()); + row++; } -void HardwarePanel::on_PPM3_editingFinished() +void HardwarePanel::addParams(int & row, QWidget * widget1, QWidget * widget2) { - if (generalSettings.trainer.calib[2] != ui->PPM3->value()) { - generalSettings.trainer.calib[2] = ui->PPM3->value(); - emit modified(); - } -} - -void HardwarePanel::on_PPM4_editingFinished() -{ - if (generalSettings.trainer.calib[3] != ui->PPM4->value()) { - generalSettings.trainer.calib[3] = ui->PPM4->value(); - emit modified(); - } -} - - -void HardwarePanel::on_txCurrentCalibration_editingFinished() -{ - if (generalSettings.txCurrentCalibration != ui->txCurrentCalibration->value()) { - generalSettings.txCurrentCalibration = ui->txCurrentCalibration->value(); - emit modified(); - } -} - -void HardwarePanel::setValues() -{ - ui->txVoltageCalibration->setValue((double)generalSettings.txVoltageCalibration/10); - ui->txCurrentCalibration->setValue((double)generalSettings.txCurrentCalibration); - - ui->PPM1->setValue(generalSettings.trainer.calib[0]); - ui->PPM2->setValue(generalSettings.trainer.calib[1]); - ui->PPM3->setValue(generalSettings.trainer.calib[2]); - ui->PPM4->setValue(generalSettings.trainer.calib[3]); - ui->PPM_MultiplierDSB->setValue((qreal)(generalSettings.PPM_Multiplier+10)/10); -} - -void HardwarePanel::on_txVoltageCalibration_editingFinished() -{ - if (generalSettings.txVoltageCalibration != ui->txVoltageCalibration->value()*10) { - generalSettings.txVoltageCalibration = ui->txVoltageCalibration->value()*10; - emit modified(); - } -} - -void HardwarePanel::on_serialPortMode_currentIndexChanged(int index) -{ - generalSettings.auxSerialMode = index; - emit modified(); + QGridLayout *subgrid = new QGridLayout(); + subgrid->addWidget(widget1, 0, 0); + if (widget2) + subgrid->addWidget(widget2, 0, 1); + else + addHSpring(subgrid, 1, 0); + addHSpring(subgrid, 2, 0); + grid->addLayout(subgrid, row, 1); + row++; } diff --git a/companion/src/generaledit/hardware.h b/companion/src/generaledit/hardware.h index 3b63a1d77..71636a2cc 100644 --- a/companion/src/generaledit/hardware.h +++ b/companion/src/generaledit/hardware.h @@ -18,52 +18,33 @@ * GNU General Public License for more details. */ -#ifndef _HARDWARE_H_ -#define _HARDWARE_H_ +#pragma once #include "generaledit.h" -namespace Ui { - class Hardware; -} - -class QLabel; -class AutoLineEdit; -class AutoComboBox; +class CompoundItemModelFactory; +class FilteredItemModelFactory; +class QGridLayout; class HardwarePanel : public GeneralPanel { Q_OBJECT public: - HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware); + HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware, CompoundItemModelFactory * editorItemModels); virtual ~HardwarePanel(); - private slots: - void on_PPM1_editingFinished(); - void on_PPM2_editingFinished(); - void on_PPM3_editingFinished(); - void on_PPM4_editingFinished(); - void on_PPM_MultiplierDSB_editingFinished(); - - void on_txCurrentCalibration_editingFinished(); - void on_txVoltageCalibration_editingFinished(); - void on_filterEnable_stateChanged(); - void on_rtcCheckDisable_stateChanged(); - void on_sportPower_stateChanged(); - - void on_serialPortMode_currentIndexChanged(int index); - - protected: - void setupPotType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type); - void setupSliderType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type); - void setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos = true); - private: - Ui::Hardware *ui; + Board::Type board; + CompoundItemModelFactory *editorItemModels; + FilteredItemModelFactory *tabFilteredModels; + QGridLayout *grid; - void setValues(); - bool isSwitch3Pos(int idx); + void addStick(int index, int & row); + void addPot(int index, int & row); + void addSlider(int index, int & row); + void addSwitch(int index, int & row); + void addLabel(QString text, int row, int col); + void addLine(int & row); + void addParams(int & row, QWidget * widget1, QWidget * widget2 = nullptr); }; - -#endif // _HARDWARE_H_ diff --git a/companion/src/generaledit/hardware.ui b/companion/src/generaledit/hardware.ui deleted file mode 100644 index 5224ed785..000000000 --- a/companion/src/generaledit/hardware.ui +++ /dev/null @@ -1,1160 +0,0 @@ - - - Hardware - - - - 0 - 0 - 470 - 1618 - - - - - 0 - 0 - - - - Form - - - - 6 - - - - - - - - - - - - - - - - - - - OFF - - - - - S-Port Mirror - - - - - Telemetry - - - - - SBUS Trainer - - - - - Debug - - - - - - - - - - - - - - - - - - - - - Thr - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - 3 - - - - - - - SD - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 10 - - - - Qt::Horizontal - - - - - - - SO - - - - - - - -49 - - - 49 - - - - - - - 3 - - - - - - - RS - - - - - - - 3 - - - - - - - Ail - - - - - - - S4 - - - - - - - - - - - - - - - - -9999 - - - 9999 - - - - - - - LS2 - - - - - - - Antenna - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - PPM 1 - - - - - - - LS - - - - - - - Rud - - - - - - - Serial Port - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - SP - - - - - - - 3 - - - - - - - RS2 - - - - - - - - - - - - - - - - - SH - - - - - - - - - - - - - - - - - SM - - - - - - - SE - - - - - - - - - - - - - - - - - - - - 1 - - - 5.000000000000000 - - - 1.000000000000000 - - - - - - - S2 - - - - - - - 3 - - - - - - - - - - - - - - - - -9999 - - - 9999 - - - - - - - SJ - - - - - - - PPM 2 - - - - - - - 3 - - - - - - - SG - - - - - - - S5 - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 10 - - - - Qt::Horizontal - - - - - - - Current Offset - - - - - - - SK - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - ADC Filter - - - - - - - 3 - - - - - - - 3 - - - - - - - SF - - - - - - - - - - - - - - - - - - - - - - - - - - - S3 - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - SB - - - - - - - - - - - - - - - - - - - - SI - - - - - - - SQ - - - - - - - Ele - - - - - - - 3 - - - - - - - 3 - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - 3 - - - - - - - - - - SA - - - - - - - 3 - - - - - - - - - - - - - - SR - - - - - - - 3 - - - - - - - PPM Multiplier - - - - - - - S1 - - - - - - - - 0 - 0 - - - - Bluetooth - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - PPM 4 - - - - - - - - - - - - - - - - - v - - - 1 - - - -9.900000000000000 - - - 9.900000000000000 - - - 0.100000000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - 3 - - - - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - Device Name: - - - - - - - 10 - - - - - - - - - - PPM 3 - - - - - - - RTC Batt Check - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SL - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - 3 - - - - - - - - - - - - - - - - -9999 - - - 9999 - - - - - - - 3 - - - - - - - SC - - - - - - - 3 - - - - - - - - - - - - - - - - -9999 - - - 9999 - - - - - - - - 0 - 10 - - - - Qt::Horizontal - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - SN - - - - - - - Battery Offset - - - - - - - 3 - - - - - - - 3 - - - - - - - S.Port Power - - - - - - - - - - - - - - - AutoComboBox - QComboBox -
autocombobox.h
-
- - AutoLineEdit - QLineEdit -
autolineedit.h
-
-
- - -
diff --git a/companion/src/generaledit/trainer.cpp b/companion/src/generaledit/trainer.cpp index 721e2d60a..997f5f456 100644 --- a/companion/src/generaledit/trainer.cpp +++ b/companion/src/generaledit/trainer.cpp @@ -19,103 +19,106 @@ */ #include "trainer.h" -#include "ui_trainer.h" +#include "compounditemmodels.h" +#include "autocombobox.h" +#include "autolineedit.h" +#include "autospinbox.h" +#include "autodoublespinbox.h" -TrainerPanel::TrainerPanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware): - GeneralPanel(parent, generalSettings, firmware), - ui(new Ui::Trainer) +#include +#include +#include + +TrainerPanel::TrainerPanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware, CompoundItemModelFactory * editorItemModels): + GeneralPanel(parent, generalSettings, firmware) { - ui->setupUi(this); + int modeid = editorItemModels->registerItemModel(TrainerMix::modeItemModel()); + int srcid = editorItemModels->registerItemModel(TrainerMix::srcItemModel()); + Board::Type board = getCurrentBoard(); + const int stickcnt = Boards::getCapability(board, Board::Sticks); - ui->trnMode_1->setCurrentIndex(generalSettings.trainer.mix[0].mode); - ui->trnChn_1->setCurrentIndex(generalSettings.trainer.mix[0].src); - ui->trnWeight_1->setValue(generalSettings.trainer.mix[0].weight); - ui->trnMode_2->setCurrentIndex(generalSettings.trainer.mix[1].mode); - ui->trnChn_2->setCurrentIndex(generalSettings.trainer.mix[1].src); - ui->trnWeight_2->setValue(generalSettings.trainer.mix[1].weight); - ui->trnMode_3->setCurrentIndex(generalSettings.trainer.mix[2].mode); - ui->trnChn_3->setCurrentIndex(generalSettings.trainer.mix[2].src); - ui->trnWeight_3->setValue(generalSettings.trainer.mix[2].weight); - ui->trnMode_4->setCurrentIndex(generalSettings.trainer.mix[3].mode); - ui->trnChn_4->setCurrentIndex(generalSettings.trainer.mix[3].src); - ui->trnWeight_4->setValue(generalSettings.trainer.mix[3].weight); + const FieldRange weightrng = TrainerMix::getWeightRange(); + grid = new QGridLayout(this); + + int col = 0; + int row = 0; + + if (stickcnt) { + addLabel(tr("Mode"), row, 1); + addLabel(tr("Weight"), row, 2); + addLabel(tr("Source"), row++, 3); + + for (int i = 0; i < 4; i++, row++) { // TODO constant + col = 0; + addLabel(Boards::getAnalogInputName(board, i), row, col++); + + AutoComboBox *mode = new AutoComboBox(this); + mode->setModel(editorItemModels->getItemModel(modeid)); + mode->setField(generalSettings.trainer.mix[i].mode, this); + grid->addWidget(mode, row, col++); + + AutoSpinBox *weight = new AutoSpinBox(this); + weight->setRange(weightrng.min, weightrng.max); + weight->setField(generalSettings.trainer.mix[i].weight, this); + grid->addWidget(weight, row, col++); + + AutoComboBox *src = new AutoComboBox(this); + src->setModel(editorItemModels->getItemModel(srcid)); + src->setField(generalSettings.trainer.mix[i].src, this); + grid->addWidget(src, row, col++); + } + + addLine(row++, 0, grid->columnCount()); + } + + col = 0; + addLabel(tr("Multiplier"), row, col++); + + const FieldRange ppmmrng = GeneralSettings::getPPM_MultiplierRange(); + + AutoDoubleSpinBox *multi = new AutoDoubleSpinBox(this); + multi->setDecimals(ppmmrng.decimals); + multi->setOffset(ppmmrng.offset); + multi->setSingleStep(ppmmrng.step); + multi->setRange(ppmmrng.min, ppmmrng.max); + multi->setField(generalSettings.PPM_Multiplier, this); + grid->addWidget(multi, row++, col); + + col = 0; + + addLabel(tr("Calibration"), row, col++); + + for (int i = 0; i < stickcnt; i++, col++) { + AutoLineEdit *calib = new AutoLineEdit(this); + calib->setText(QString("%1").arg(generalSettings.trainer.calib[i])); + calib->setReadOnly(true); + grid->addWidget(calib, row, col); + } + + addHSpring(grid, grid->columnCount(), 0); + addVSpring(grid, 0, grid->rowCount()); + disableMouseScrolling(); } TrainerPanel::~TrainerPanel() { - delete ui; } -void TrainerPanel::on_trnMode_1_currentIndexChanged(int index) +void TrainerPanel::addLabel(QString text, int row, int col) { - generalSettings.trainer.mix[0].mode = index; - emit modified(); + QLabel *label = new QLabel(this); + label->setText(text); + grid->addWidget(label, row, col); } -void TrainerPanel::on_trnChn_1_currentIndexChanged(int index) +void TrainerPanel::addLine(int row, int col, int colspan) { - generalSettings.trainer.mix[0].src = index; - emit modified(); -} - -void TrainerPanel::on_trnWeight_1_editingFinished() -{ - generalSettings.trainer.mix[0].weight = ui->trnWeight_1->value(); - emit modified(); -} - -void TrainerPanel::on_trnMode_2_currentIndexChanged(int index) -{ - generalSettings.trainer.mix[1].mode = index; - emit modified(); -} - -void TrainerPanel::on_trnChn_2_currentIndexChanged(int index) -{ - generalSettings.trainer.mix[1].src = index; - emit modified(); -} - -void TrainerPanel::on_trnWeight_2_editingFinished() -{ - generalSettings.trainer.mix[1].weight = ui->trnWeight_2->value(); - emit modified(); -} - -void TrainerPanel::on_trnMode_3_currentIndexChanged(int index) -{ - generalSettings.trainer.mix[2].mode = index; - emit modified(); -} - -void TrainerPanel::on_trnChn_3_currentIndexChanged(int index) -{ - generalSettings.trainer.mix[2].src = index; - emit modified(); -} - -void TrainerPanel::on_trnWeight_3_editingFinished() -{ - generalSettings.trainer.mix[2].weight = ui->trnWeight_3->value(); - emit modified(); -} - -void TrainerPanel::on_trnMode_4_currentIndexChanged(int index) -{ - generalSettings.trainer.mix[3].mode = index; - emit modified(); -} - -void TrainerPanel::on_trnChn_4_currentIndexChanged(int index) -{ - generalSettings.trainer.mix[3].src = index; - emit modified(); -} - -void TrainerPanel::on_trnWeight_4_editingFinished() -{ - generalSettings.trainer.mix[3].weight = ui->trnWeight_4->value(); - emit modified(); + QFrame *line = new QFrame(this); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + line->setLineWidth(1); + line->setMidLineWidth(0); + grid->addWidget(line, row, col, 1, colspan); } diff --git a/companion/src/generaledit/trainer.h b/companion/src/generaledit/trainer.h index 56442dc8b..e0c777af4 100644 --- a/companion/src/generaledit/trainer.h +++ b/companion/src/generaledit/trainer.h @@ -18,42 +18,23 @@ * GNU General Public License for more details. */ -#ifndef _TRAINER_H_ -#define _TRAINER_H_ +#pragma once #include "generaledit.h" #include "eeprominterface.h" -namespace Ui { - class Trainer; -} +class CompoundItemModelFactory; class TrainerPanel : public GeneralPanel { Q_OBJECT public: - TrainerPanel(QWidget *parent, GeneralSettings & generalSettings, Firmware * firmware); + TrainerPanel(QWidget *parent, GeneralSettings & generalSettings, Firmware * firmware, CompoundItemModelFactory * editorItemModels); virtual ~TrainerPanel(); - private slots: - void on_trnMode_1_currentIndexChanged(int index); - void on_trnChn_1_currentIndexChanged(int index); - void on_trnWeight_1_editingFinished(); - void on_trnMode_2_currentIndexChanged(int index); - void on_trnChn_2_currentIndexChanged(int index); - void on_trnWeight_2_editingFinished(); - void on_trnMode_3_currentIndexChanged(int index); - void on_trnChn_3_currentIndexChanged(int index); - void on_trnWeight_3_editingFinished(); - void on_trnMode_4_currentIndexChanged(int index); - void on_trnChn_4_currentIndexChanged(int index); - void on_trnWeight_4_editingFinished(); - private: - Ui::Trainer *ui; - - void setValues(); + QGridLayout * grid; + void addLabel(QString text, int row, int col); + void addLine(int row, int col, int colspan); }; - -#endif // _TRAINER_H_ diff --git a/companion/src/generaledit/trainer.ui b/companion/src/generaledit/trainer.ui deleted file mode 100644 index 312999a0d..000000000 --- a/companion/src/generaledit/trainer.ui +++ /dev/null @@ -1,475 +0,0 @@ - - - Trainer - - - - 0 - 0 - 400 - 300 - - - - Form - - - - - - - - - - - - - - - -125 - - - 125 - - - - - - - Mode - - - - - - - Input - - - - - - - Weight - - - - - - - - 0 - 0 - - - - Rud - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - Off - - - - - += (Sum) - - - - - := (Replace) - - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - chn1 - - - - - chn2 - - - - - chn3 - - - - - chn4 - - - - - - - - - - - - - - - - - -125 - - - 125 - - - - - - - - 0 - 0 - - - - Ele - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - Off - - - - - += (Sum) - - - - - := (Replace) - - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - chn1 - - - - - chn2 - - - - - chn3 - - - - - chn4 - - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - chn1 - - - - - chn2 - - - - - chn3 - - - - - chn4 - - - - - - - - - - - - - - - - - -125 - - - 125 - - - - - - - - 0 - 0 - - - - Thr - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - Off - - - - - += (Sum) - - - - - := (Replace) - - - - - - - - - 0 - 0 - - - - Ail - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - Off - - - - - += (Sum) - - - - - := (Replace) - - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - chn1 - - - - - chn2 - - - - - chn3 - - - - - chn4 - - - - - - - - - - - - - - - - - -125 - - - 125 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index c1cd7de79..5f749fa33 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -620,6 +620,17 @@ void TableLayout::setColumnWidth(int col, int width) #if defined(TABLE_LAYOUT) tableWidget->setColumnWidth(col, width); #else + gridWidget->setColumnMinimumWidth(col, width); +#endif +} + +void TableLayout::setColumnWidth(int col, QString str) +{ +#if defined(TABLE_LAYOUT) +#else + QFontMetrics *f = new QFontMetrics(QFont()); + QSize sz = f->size(Qt::TextSingleLine, str); + setColumnWidth(col, sz.width()); #endif } @@ -628,12 +639,19 @@ void TableLayout::pushRowsUp(int row) #if defined(TABLE_LAYOUT) #else // Push the rows up - QSpacerItem * spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ); + QSpacerItem * spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); gridWidget->addItem(spacer, row, 0); #endif - // Push rows upward - // addDoubleSpring(gridLayout, 5, num_fsw+1); +} +void TableLayout::pushColumnsLeft(int col) +{ +#if defined(TABLE_LAYOUT) +#else + // Push the columns to the left + QSpacerItem * spacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); + gridWidget->addItem(spacer, 0, col); +#endif } QString Helpers::getChecklistsPath() diff --git a/companion/src/helpers.h b/companion/src/helpers.h index 8bb1cc6b8..98783439b 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -191,7 +191,9 @@ public: void resizeColumnsToContents(); void setColumnWidth(int col, int width); + void setColumnWidth(int col, QString str); void pushRowsUp(int row); + void pushColumnsLeft(int col); private: #if defined(TABLE_LAYOUT) diff --git a/companion/src/shared/CMakeLists.txt b/companion/src/shared/CMakeLists.txt index ffd5942bf..9085d7632 100644 --- a/companion/src/shared/CMakeLists.txt +++ b/companion/src/shared/CMakeLists.txt @@ -17,6 +17,7 @@ set(shared_HDRS hexspinbox.h autoprecisioncombobox.h autotimeedit.h + autospinbox.h ) qt5_wrap_cpp(shared_SRCS ${shared_HDRS}) diff --git a/companion/src/shared/autocheckbox.h b/companion/src/shared/autocheckbox.h index 1c1a7207c..6355b6c53 100644 --- a/companion/src/shared/autocheckbox.h +++ b/companion/src/shared/autocheckbox.h @@ -32,15 +32,17 @@ class AutoCheckBox: public QCheckBox QCheckBox(parent), field(nullptr), panel(nullptr), - lock(false) + lock(false), + invert(false) { - connect(this, SIGNAL(toggled(bool)), this, SLOT(onToggled(bool))); + connect(this, &AutoCheckBox::toggled, this, &AutoCheckBox::onToggled); } - void setField(bool & field, GenericPanel * panel = nullptr) + void setField(bool & field, GenericPanel * panel = nullptr, bool invert = false) { this->field = &field; this->panel = panel; + this->invert = invert; updateValue(); } @@ -49,11 +51,17 @@ class AutoCheckBox: public QCheckBox QCheckBox::setEnabled(enabled); } + void setInvert(bool invert) + { + this->invert = invert; + updateValue(); + } + void updateValue() { if (field) { lock = true; - setChecked(*field); + setChecked(invert ? !(*field) : *field); lock = false; } } @@ -67,8 +75,9 @@ class AutoCheckBox: public QCheckBox if (panel && panel->lock) return; if (field && !lock) { - *field = checked; - emit currentDataChanged(checked); + const bool val = invert ? !checked : checked; + *field = val; + emit currentDataChanged(val); if (panel) emit panel->modified(); } @@ -78,4 +87,5 @@ class AutoCheckBox: public QCheckBox bool *field = nullptr; GenericPanel *panel = nullptr; bool lock = false; + bool invert = false; }; diff --git a/companion/src/shared/autodoublespinbox.h b/companion/src/shared/autodoublespinbox.h index a6466269e..f9614d882 100644 --- a/companion/src/shared/autodoublespinbox.h +++ b/companion/src/shared/autodoublespinbox.h @@ -35,7 +35,8 @@ class AutoDoubleSpinBox: public QDoubleSpinBox QDoubleSpinBox(parent), field(nullptr), panel(nullptr), - lock(false) + lock(false), + offset(0) { connect(this, SIGNAL(valueChanged(double)), this, SLOT(onValueChanged(double))); } @@ -58,7 +59,7 @@ class AutoDoubleSpinBox: public QDoubleSpinBox { if (field) { lock = true; - setValue(float(*field) / multiplier()); + setValue(float(*field + offset) / multiplier()); lock = false; } } @@ -69,6 +70,12 @@ class AutoDoubleSpinBox: public QDoubleSpinBox updateValue(); } + void setOffset(int offset) + { + this->offset = offset; + updateValue(); + } + protected: int multiplier() { @@ -91,8 +98,8 @@ class AutoDoubleSpinBox: public QDoubleSpinBox if (panel && panel->lock) return; if (field && !lock) { - *field = round(value * multiplier()); - emit currentDataChanged(value); + *field = round(value * multiplier() - offset); + emit currentDataChanged(*field); if (panel) { emit panel->modified(); } @@ -103,4 +110,5 @@ class AutoDoubleSpinBox: public QDoubleSpinBox int * field = nullptr; GenericPanel * panel = nullptr; bool lock = false; + int offset = 0; }; diff --git a/companion/src/shared/autospinbox.h b/companion/src/shared/autospinbox.h new file mode 100644 index 000000000..65b49c0f3 --- /dev/null +++ b/companion/src/shared/autospinbox.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#pragma once + +#include + +#include "genericpanel.h" + +class AutoSpinBox : public QSpinBox +{ + Q_OBJECT + + public: + explicit AutoSpinBox(QWidget * parent = nullptr): + QSpinBox(parent), + field(nullptr), + panel(nullptr), + lock(false) + { + connect(this, QOverload::of(&AutoSpinBox::valueChanged), this, &AutoSpinBox::onValueChanged); + } + + void setField(int & field, GenericPanel * panel = nullptr) + { + this->field = &field; + this->panel = panel; + updateValue(); + } + + void setField(unsigned int & field, GenericPanel * panel = nullptr) + { + this->field = (int *)&field; + this->panel = panel; + updateValue(); + } + + void updateValue() + { + lock = true; + if (field) { + setValue(*field); + } + lock = false; + } + + protected slots: + void onValueChanged(int value) + { + if (panel && panel->lock) + return; + if (field && !lock) { + *field = value; + if (panel) { + emit panel->modified(); + } + } + } + + protected: + int * field; + GenericPanel * panel; + bool lock; +}; diff --git a/companion/src/shared/genericpanel.h b/companion/src/shared/genericpanel.h index 88c7f841b..6d51fe767 100644 --- a/companion/src/shared/genericpanel.h +++ b/companion/src/shared/genericpanel.h @@ -41,6 +41,7 @@ class GenericPanel : public QWidget friend class AutoPrecisionComboBox; friend class AutoBitsetCheckBox; friend class AutoTimeEdit; + friend class AutoSpinBox; public: GenericPanel(QWidget *parent, ModelData * model, GeneralSettings & generalSettings, Firmware * firmware);