Echelon swift plus victory dircon (#3442)

* starting

* builds

* works with the simulator

* Update echelonconnectsport.cpp

* crash fixed

* fixing crash?

* fixing crash!

* Update echelonconnectsport.cpp

* build fix

* starting

* it's working for asking the UUID!

* i'm getting the 0003 but i need to notify the 0002

it doesn't enter into the sendCharacteristicNotification loop

* adding 0004 notifier

* kind of works (no unhandled frames)

* it works!

* wahoo rgt setting is not useful anymore

* dircon works perfectly on ios!

* improving wattage also for all bluetooth, but it's not perfect yet

* Horizon 5.0 Bike Compatibility #3001

* Update characteristicwriteprocessor0003.h

* Update dirconmanager.cpp

* Update fakebike.cpp

* simulating a fake cadence randomly

* handling unhandled case

* Log on Thread

* Update project.pbxproj

* fixing gears on startup alinged with zwift

* Update dirconmanager.cpp

https://github.com/cagnulein/qdomyos-zwift/issues/2897#issuecomment-2666126808

* Gears don't work for mid-work free ride segment (Issue #2897)

* Update project.pbxproj

* fixing bluetooth on ios with get gears from zwift enabled

* fixing bluetooth with get gears on on android? not tested

* fixing build

* Update project.pbxproj

* Update settings.qml

* Gears don't work for mid-work free ride segment (Issue #2897)

https://github.com/cagnulein/qdomyos-zwift/issues/2897#issuecomment-2692178928

* Gears don't work for mid-work free ride segment (Issue #2897)

https://github.com/cagnulein/qdomyos-zwift/issues/2897#issuecomment-2692370530

* Update project.pbxproj

* fixing memory leak

* Update project.pbxproj

* Update project.pbxproj

* build 1043

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* added gears UI from zwift directly if received

* fixing build

* fixing build

* Update project.pbxproj

* fixing zwift gears in the UI of qz

* always enabling 50ms on dircon

* Update project.pbxproj

* wahookickrsnapbike as well

* adding also zwiftclickremote

* fixing crash

* fixing crash

* Update project.pbxproj

* gear alignment between zwift and qz under a new setting

* Update project.pbxproj

* fixing wahoo swift implementation

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update project.pbxproj

* Update ios_wahookickrsnapbike.mm

* Update project.pbxproj

* adding compensation when there is a power sensor and an ergModeSuppported bike

* Update project.pbxproj

* adding compensation when there is a power sensor and an ergModeSuppported bike

* Update project.pbxproj

* Update project.pbxproj

* Elite Drivio II

* rower distance on apple health?

* Update project.pbxproj

* avoiding crash

* Update project.pbxproj

* Update project.pbxproj

* Bluetooth issues (Issue #3420)

* fixing build #3420

* Update project.pbxproj

* Bluetooth issues (Issue #3420)

* Bluetooth issues #3420

* Revert "Bluetooth issues #3420"

This reverts commit f20f55c0f1.

* Revert "Bluetooth issues (Issue #3420)"

This reverts commit 74c15befaf.

* Revert "fixing build #3420"

This reverts commit 416d10698d.

* Revert "Bluetooth issues (Issue #3420)"

This reverts commit 5cd3efe559.

* merge

* Update echelonconnectsport.h

* Update project.pbxproj

* iOS v2.18 (1061) zwift play controllers disconnecting all the time (Issue #3378)

https://github.com/cagnulein/qdomyos-zwift/issues/3378#issuecomment-2859933867

* Update project.pbxproj

* Bluetooth issues (Issue #3420)

* Update project.pbxproj

* zwift custom characteristic only if get gears from zwift is enabled

https://github.com/cagnulein/qdomyos-zwift/issues/3419#issuecomment-2860215362

* adding max resistance for SCHWINN 190U

* Update qdomyos-zwift.pri

* Update project.pbxproj

* Bluetooth issues (Issue #3420)

* Update project.pbxproj
This commit is contained in:
Roberto Viola
2025-05-19 11:40:28 +02:00
committed by GitHub
parent 0029258fa5
commit 2437c4c30c
11 changed files with 58 additions and 24 deletions

View File

@@ -396,6 +396,7 @@
8785D5442B3DD105005A2EB7 /* moc_zwift_client_auth.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8785D5422B3DD105005A2EB7 /* moc_zwift_client_auth.cpp */; };
87873AEE2D09A8AA005F86B4 /* moc_sportsplusrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87873AED2D09A8AA005F86B4 /* moc_sportsplusrower.cpp */; };
87873AF12D09A8CE005F86B4 /* sportsplusrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87873AF02D09A8CE005F86B4 /* sportsplusrower.cpp */; };
878895DB2DD48AB100BF5162 /* moc_inclinationresistancetable.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878895DA2DD48AB100BF5162 /* moc_inclinationresistancetable.cpp */; };
878A331A25AB4FF800BD13E1 /* yesoulbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878A331725AB4FF800BD13E1 /* yesoulbike.cpp */; };
878A331D25AB50C300BD13E1 /* moc_yesoulbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878A331B25AB50C200BD13E1 /* moc_yesoulbike.cpp */; };
878C9E6928B77E7C00669129 /* nordictrackifitadbbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878C9E6828B77E7B00669129 /* nordictrackifitadbbike.cpp */; };
@@ -1375,6 +1376,8 @@
87873AED2D09A8AA005F86B4 /* moc_sportsplusrower.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = moc_sportsplusrower.cpp; sourceTree = "<group>"; };
87873AF02D09A8CE005F86B4 /* sportsplusrower.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = sportsplusrower.cpp; sourceTree = "<group>"; };
87873AF22D09AADF005F86B4 /* sportsplusrower.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sportsplusrower.h; path = ../src/devices/sportsplusrower/sportsplusrower.h; sourceTree = SOURCE_ROOT; };
878895D92DD48AB100BF5162 /* inclinationresistancetable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = inclinationresistancetable.h; path = ../src/inclinationresistancetable.h; sourceTree = SOURCE_ROOT; };
878895DA2DD48AB100BF5162 /* moc_inclinationresistancetable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = moc_inclinationresistancetable.cpp; sourceTree = "<group>"; };
8789DCDB6A4F681A76DF3F92 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "/Users/cagnulein/Qt/5.15.2/ios/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
878A331725AB4FF800BD13E1 /* yesoulbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = yesoulbike.cpp; path = ../src/devices/yesoulbike/yesoulbike.cpp; sourceTree = "<group>"; };
878A331825AB4FF800BD13E1 /* yesoulbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = yesoulbike.h; path = ../src/devices/yesoulbike/yesoulbike.h; sourceTree = "<group>"; };
@@ -2058,6 +2061,8 @@
25B08E2869634E9BCBA333A2 /* Generated Sources */ = {
isa = PBXGroup;
children = (
878895D92DD48AB100BF5162 /* inclinationresistancetable.h */,
878895DA2DD48AB100BF5162 /* moc_inclinationresistancetable.cpp */,
87C4E5BC2C1C1D2600D0750E /* moc_crossrope.cpp */,
87C424252BC1294000503687 /* moc_treadmillErgTable.cpp */,
874823FD2B935ADA006F3CA1 /* moc_ergtable.cpp */,
@@ -3603,6 +3608,7 @@
87DAE16426E9FF3A00B0527E /* kingsmithr2treadmill.cpp in Compile Sources */,
87F93427278E0EC00088B596 /* domyosrower.cpp in Compile Sources */,
87B617EE25F25FED0094A1CB /* snodebike.cpp in Compile Sources */,
878895DB2DD48AB100BF5162 /* moc_inclinationresistancetable.cpp in Compile Sources */,
87C5F0B526285E5F0067A1B5 /* mimemessage.cpp in Compile Sources */,
8768C8C92BBC11C80099DBE1 /* adb_client.c in Compile Sources */,
873063C0259DF2C500DA0F44 /* moc_heartratebelt.cpp in Compile Sources */,
@@ -4367,7 +4373,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "../src/ios/qdomyos-zwift.entitlements";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1080;
CURRENT_PROJECT_VERSION = 1087;
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = "ADB_HOST=1";
@@ -4561,7 +4567,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "../src/ios/qdomyos-zwift.entitlements";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1080;
CURRENT_PROJECT_VERSION = 1087;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = NO;
@@ -4791,7 +4797,7 @@
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1080;
CURRENT_PROJECT_VERSION = 1087;
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -4887,7 +4893,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1080;
CURRENT_PROJECT_VERSION = 1087;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = YES;
@@ -4979,7 +4985,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1080;
CURRENT_PROJECT_VERSION = 1087;
DEVELOPMENT_ASSET_PATHS = "\"watchkit Extension/Preview Content\"";
ENABLE_BITCODE = YES;
ENABLE_PREVIEWS = YES;
@@ -5095,7 +5101,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1080;
CURRENT_PROJECT_VERSION = 1087;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = "\"watchkit Extension/Preview Content\"";
ENABLE_BITCODE = YES;

View File

@@ -62,17 +62,28 @@ void bike::changePower(int32_t power) {
return;
}
requestPower = power; // used by some bikes that have ERG mode builtin
QSettings settings;
bool power_sensor = !settings.value(QZSettings::power_sensor_name, QZSettings::default_power_sensor_name)
.toString()
.startsWith(QStringLiteral("Disabled"));
double erg_filter_upper =
settings.value(QZSettings::zwift_erg_filter, QZSettings::default_zwift_erg_filter).toDouble();
double erg_filter_lower =
settings.value(QZSettings::zwift_erg_filter_down, QZSettings::default_zwift_erg_filter_down).toDouble();
requestPower = power; // used by some bikes that have ERG mode builtin
if(power_sensor && ergModeSupported && m_rawWatt.value() > 0 && m_watt.value() > 0 && fabs(requestPower - m_watt.average5s()) < qMax(erg_filter_upper, erg_filter_lower)) {
qDebug() << "applying delta watt to power request m_rawWatt" << m_rawWatt.average5s() << "watt" << m_watt.average5s() << "req" << requestPower;
// the concept here is to trying to add or decrease the delta from the power sensor
requestPower += (requestPower - m_watt.average5s());
}
bool force_resistance =
settings.value(QZSettings::virtualbike_forceresistance, QZSettings::default_virtualbike_forceresistance)
.toBool();
// bool erg_mode = settings.value(QZSettings::zwift_erg, QZSettings::default_zwift_erg).toBool(); //Not used
// anywhere in code
double erg_filter_upper =
settings.value(QZSettings::zwift_erg_filter, QZSettings::default_zwift_erg_filter).toDouble();
double erg_filter_lower =
settings.value(QZSettings::zwift_erg_filter_down, QZSettings::default_zwift_erg_filter_down).toDouble();
double deltaDown = wattsMetric().value() - ((double)power);
double deltaUp = ((double)power) - wattsMetric().value();
qDebug() << QStringLiteral("filter ") + QString::number(deltaUp) + " " + QString::number(deltaDown) + " " +
@@ -176,6 +187,7 @@ void bike::clearStats() {
m_jouls.clear(true);
elevationAcc = 0;
m_watt.clear(false);
m_rawWatt.clear(false);
WeightLoss.clear(false);
RequestedPelotonResistance.clear(false);
@@ -203,6 +215,7 @@ void bike::setPaused(bool p) {
Heart.setPaused(p);
m_jouls.setPaused(p);
m_watt.setPaused(p);
m_rawWatt.setPaused(p);
WeightLoss.setPaused(p);
m_pelotonResistance.setPaused(p);
Cadence.setPaused(p);
@@ -228,6 +241,7 @@ void bike::setLap() {
Heart.setLap(false);
m_jouls.setLap(true);
m_watt.setLap(false);
m_rawWatt.setLap(false);
WeightLoss.setLap(false);
WattKg.setLap(false);

View File

@@ -282,6 +282,7 @@ void bluetoothdevice::clearStats() {
m_jouls.clear(true);
elevationAcc = 0;
m_watt.clear(false);
m_rawWatt.clear(false);
WeightLoss.clear(false);
WattKg.clear(false);
Cadence.clear(false);
@@ -302,6 +303,7 @@ void bluetoothdevice::setPaused(bool p) {
Heart.setPaused(p);
m_jouls.setPaused(p);
m_watt.setPaused(p);
m_rawWatt.setPaused(p);
WeightLoss.setPaused(p);
WattKg.setPaused(p);
Cadence.setPaused(p);
@@ -321,6 +323,7 @@ void bluetoothdevice::setLap() {
Heart.setLap(false);
m_jouls.setLap(true);
m_watt.setLap(false);
m_rawWatt.setLap(false);
WeightLoss.setLap(false);
WattKg.setLap(false);
Cadence.setLap(false);

View File

@@ -591,9 +591,14 @@ class bluetoothdevice : public QObject {
metric elevationAcc;
/**
* @brief m_watt Metric to get and set the power expended in the session. Unit: watts
* @brief m_watt Metric to get and set the power read from the trainer or from the power sensor Unit: watts
*/
metric m_watt;
/**
* @brief m_rawWatt Metric to get and set the power from the trainer only. Unit: watts
*/
metric m_rawWatt;
/**
* @brief WattKg Metric to get and set the watt kg for the session (what's this?). Unit: watt kg

View File

@@ -18,6 +18,7 @@ proformtelnetbike::proformtelnetbike(bool noWriteResistance, bool noHeartService
double bikeResistanceGain) {
QSettings settings;
m_watt.setType(metric::METRIC_WATT);
m_rawWatt.setType(metric::METRIC_WATT);
target_watts.setType(metric::METRIC_WATT);
Speed.setType(metric::METRIC_SPEED);
refresh = new QTimer(this);
@@ -298,11 +299,11 @@ void proformtelnetbike::characteristicChanged(const char *buff, int len) {
QStringList packet = QString::fromLocal8Bit(newValue).split(" ");
qDebug() << packet;
if (newValue.contains("Current Watts")) {
double watt = packet[3].toDouble();
m_rawWatt = packet[3].toDouble();
if (settings.value(QZSettings::power_sensor_name, QZSettings::default_power_sensor_name)
.toString()
.startsWith(QStringLiteral("Disabled")))
m_watt = watt;
m_watt = m_rawWatt.value();
emit debug(QStringLiteral("Current Watt: ") + QString::number(watts()));
} else if (newValue.contains("Cur RPM")) {
double RPM = packet[3].toDouble();

View File

@@ -18,6 +18,7 @@ proformwifibike::proformwifibike(bool noWriteResistance, bool noHeartService, in
double bikeResistanceGain) {
QSettings settings;
m_watt.setType(metric::METRIC_WATT);
m_rawWatt.setType(metric::METRIC_WATT);
target_watts.setType(metric::METRIC_WATT);
Speed.setType(metric::METRIC_SPEED);
refresh = new QTimer(this);
@@ -483,11 +484,11 @@ void proformwifibike::characteristicChanged(const QString &newValue) {
// some buggy TDF1 bikes send spurious wattage at the end with cadence = 0
if (Cadence.value() > 0) {
if (!values[QStringLiteral("Current Watts")].isUndefined()) {
double watt = values[QStringLiteral("Current Watts")].toString().toDouble();
m_rawWatt = values[QStringLiteral("Current Watts")].toString().toDouble();
if (settings.value(QZSettings::power_sensor_name, QZSettings::default_power_sensor_name)
.toString()
.startsWith(QStringLiteral("Disabled")))
m_watt = watt;
m_watt = m_rawWatt.value();
emit debug(QStringLiteral("Current Watt: ") + QString::number(watts()));
} else if (!values[QStringLiteral("Watt attuali")].isUndefined()) {
double watt = values[QStringLiteral("Watt attuali")].toString().toDouble();

View File

@@ -18,6 +18,7 @@ renphobike::renphobike(bool noWriteResistance, bool noHeartService) {
ergModeSupported = true; // IMPORTANT, only for this bike
m_watt.setType(metric::METRIC_WATT);
m_rawWatt.setType(metric::METRIC_WATT);
Speed.setType(metric::METRIC_SPEED);
refresh = new QTimer(this);
this->noWriteResistance = noWriteResistance;
@@ -286,15 +287,15 @@ void renphobike::characteristicChanged(const QLowEnergyCharacteristic &character
}
if (Flags.instantPower) {
wattFromBike =
m_rawWatt =
((double)(((uint16_t)((uint8_t)newValue.at(index + 1)) << 8) | (uint16_t)((uint8_t)newValue.at(index))));
if (settings.value(QZSettings::power_sensor_name, QZSettings::default_power_sensor_name)
.toString()
.startsWith(QStringLiteral("Disabled")))
m_watt = wattFromBike.value();
m_watt = m_rawWatt.value();
index += 2;
debug("Current Watt: " + QString::number(m_watt.value()));
debug("Current Watt from the Bike: " + QString::number(wattFromBike.value()));
debug("Current Watt from the Bike: " + QString::number(m_rawWatt.value()));
}
if (Flags.avgPower) {
@@ -529,7 +530,7 @@ uint16_t renphobike::ergModificator(uint16_t powerRequested) {
double f = ((double)powerRequested * (double)powerRequested) / m_watt.average5s();
lastPowerRequestedFactor = f / powerRequested;
powerRequested = f;
qDebug() << QStringLiteral("power sensor detected, reading from the bike") << wattFromBike.value()
qDebug() << QStringLiteral("power sensor detected, reading from the bike") << m_rawWatt.value()
<< QStringLiteral("reading from power pedal") << m_watt.value()
<< QStringLiteral("reading from power pedal (avg 5s)") << m_watt.average5s()
<< QStringLiteral("powerRequested") << powerRequested;

View File

@@ -71,8 +71,6 @@ class renphobike : public bike {
bool noWriteResistance = false;
bool noHeartService = false;
metric wattFromBike;
#ifdef Q_OS_IOS
lockscreen *h = 0;
#endif

View File

@@ -22,6 +22,7 @@ wahookickrsnapbike::wahookickrsnapbike(bool noWriteResistance, bool noHeartServi
ergModeSupported = true; // IMPORTANT, only for this bike
m_watt.setType(metric::METRIC_WATT);
m_rawWatt.setType(metric::METRIC_WATT);
Speed.setType(metric::METRIC_SPEED);
refresh = new QTimer(this);
this->noWriteResistance = noWriteResistance;
@@ -255,6 +256,7 @@ void wahookickrsnapbike::update() {
bool power_sensor = !settings.value(QZSettings::power_sensor_name, QZSettings::default_power_sensor_name)
.toString()
.startsWith(QStringLiteral("Disabled"));
QByteArray a = setErgMode(requestPower);
uint8_t b[20];
memcpy(b, a.constData(), a.length());
@@ -410,10 +412,11 @@ void wahookickrsnapbike::handleCharacteristicValueChanged(const QBluetoothUuid &
uint8_t index = 4;
if (newValue.length() > 3) {
m_rawWatt = (((uint16_t)((uint8_t)newValue.at(3)) << 8) | (uint16_t)((uint8_t)newValue.at(2)));
if (settings.value(QZSettings::power_sensor_name, QZSettings::default_power_sensor_name)
.toString()
.startsWith(QStringLiteral("Disabled")))
m_watt = (((uint16_t)((uint8_t)newValue.at(3)) << 8) | (uint16_t)((uint8_t)newValue.at(2)));
m_watt = m_rawWatt.value();
}
emit powerChanged(m_watt.value());

View File

@@ -918,7 +918,6 @@ const QString QZSettings::tile_coretemperature_order = QStringLiteral("tile_core
const QString QZSettings::nordictrack_t65s_treadmill_81_miles = QStringLiteral("nordictrack_t65s_treadmill_81_miles");
const QString QZSettings::nordictrack_elite_800 = QStringLiteral("nordictrack_elite_800");
const QString QZSettings::ios_btdevice_native = QStringLiteral("ios_btdevice_native");
const QString QZSettings::inclinationResistancePoints = QStringLiteral("inclinationResistancePoints");
@@ -1699,6 +1698,7 @@ QVariant allSettings[allSettingsCount][2] = {
{QZSettings::nordictrack_t65s_treadmill_81_miles, QZSettings::default_nordictrack_t65s_treadmill_81_miles},
{QZSettings::nordictrack_elite_800, QZSettings::default_nordictrack_elite_800},
{QZSettings::ios_btdevice_native, QZSettings::default_ios_btdevice_native},
{QZSettings::inclinationResistancePoints, QZSettings::default_inclinationResistancePoints},
};

View File

@@ -2461,6 +2461,8 @@ class QZSettings {
static const QString nordictrack_elite_800;
static constexpr bool default_nordictrack_elite_800 = false;
static const QString ios_btdevice_native;
static constexpr bool default_ios_btdevice_native = false;
static const QString inclinationResistancePoints;
static const QString default_inclinationResistancePoints;