Compare commits

...

2 Commits

Author SHA1 Message Date
Roberto Viola
5f54c63f64 Adding stop and start 2026-01-17 13:16:18 +01:00
Roberto Viola
a436ae9b40 first commit 2026-01-17 10:57:10 +01:00
5 changed files with 194 additions and 4 deletions

View File

@@ -78,7 +78,7 @@ void proformtreadmill::forceIncline(double incline) {
proform_treadmill_sport_8_5 || proform_treadmill_505_cst || proform_505_cst_80_44 || proform_carbon_tl || proform_proshox2 || nordictrack_s20i_treadmill || proform_595i_proshox2 ||
proform_treadmill_8_7 || proform_carbon_tl_PFTL59720 || proform_treadmill_sport_70 || proform_treadmill_575i || proform_performance_300i || proform_performance_400i || proform_treadmill_c700 ||
proform_treadmill_c960i || nordictrack_tseries5_treadmill || proform_carbon_tl_PFTL59722c || proform_treadmill_1500_pro || proform_trainer_8_0 || proform_treadmill_705_cst_V80_44 ||
nordictrack_treadmill_ultra_le || proform_treadmill_carbon_tls || proform_treadmill_sport_3_0 || proform_treadmill_995i || nordictrack_series_7
nordictrack_treadmill_ultra_le || proform_treadmill_carbon_tls || proform_treadmill_sport_3_0 || proform_treadmill_995i || nordictrack_series_7 || proform_power_595i
) {
write[14] = write[11] + write[12] + 0x12;
} else if (!nordictrack_t65s_treadmill && !nordictrack_elite_800 && !nordictrack_t65s_treadmill_81_miles && !nordictrack_s30_treadmill && !nordictrack_s20_treadmill && !nordictrack_t65s_83_treadmill) {
@@ -108,7 +108,7 @@ void proformtreadmill::forceSpeed(double speed) {
proform_treadmill_sport_8_5 || proform_treadmill_505_cst || proform_505_cst_80_44 || proform_treadmill_705_cst || proform_treadmill_705_cst_V78_239 || proform_carbon_tl || proform_proshox2 || nordictrack_s20i_treadmill || proform_595i_proshox2 ||
proform_treadmill_8_7 || proform_carbon_tl_PFTL59720 || proform_treadmill_sport_70 || proform_treadmill_575i || proform_performance_300i || proform_performance_400i || proform_treadmill_c700 ||
proform_treadmill_c960i || nordictrack_tseries5_treadmill || proform_carbon_tl_PFTL59722c || proform_treadmill_1500_pro || proform_trainer_8_0 || proform_treadmill_705_cst_V80_44 ||
nordictrack_treadmill_ultra_le || proform_treadmill_carbon_tls || proform_treadmill_sport_3_0 || proform_treadmill_995i || nordictrack_series_7) {
nordictrack_treadmill_ultra_le || proform_treadmill_carbon_tls || proform_treadmill_sport_3_0 || proform_treadmill_995i || nordictrack_series_7 || proform_power_595i) {
write[14] = write[11] + write[12] + 0x11;
} else if (!nordictrack_t65s_treadmill && !nordictrack_elite_800 && !nordictrack_t65s_treadmill_81_miles && !nordictrack_s30_treadmill && !nordictrack_s20_treadmill && !nordictrack_t65s_83_treadmill) {
for (uint8_t i = 0; i < 7; i++) {
@@ -858,6 +858,87 @@ void proformtreadmill::update() {
if (counterPoll > 5) {
counterPoll = 0;
}
} else if (proform_power_595i) {
// ProForm Power 595i polling cycle (2 states)
uint8_t noOpData1[] = {0xfe, 0x02, 0x19, 0x03};
uint8_t noOpData2[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x15, 0x04, 0x15, 0x02, 0x00,
0x0f, 0x80, 0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t noOpData3[] = {0xff, 0x07, 0x00, 0x00, 0x00, 0x81, 0x00, 0x10, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t noOpData4[] = {0xfe, 0x02, 0x14, 0x03};
uint8_t noOpData5[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x10, 0x04, 0x10, 0x02, 0x00,
0x0a, 0x1b, 0x94, 0x30, 0x00, 0x10, 0x40, 0x50, 0x00, 0x80};
uint8_t noOpData6[] = {0xff, 0x02, 0x18, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
switch (counterPoll) {
case 0:
writeCharacteristic(noOpData1, sizeof(noOpData1), QStringLiteral("noOp"));
break;
case 1:
writeCharacteristic(noOpData2, sizeof(noOpData2), QStringLiteral("noOp"));
break;
case 2:
writeCharacteristic(noOpData3, sizeof(noOpData3), QStringLiteral("noOp"), false, true);
if (requestInclination != -100) {
if (requestInclination < 0)
requestInclination = 0;
if (requestInclination != currentInclination().value() && requestInclination >= 0 &&
requestInclination <= 15) {
emit debug(QStringLiteral("writing incline ") + QString::number(requestInclination));
forceIncline(requestInclination);
}
requestInclination = -100;
}
if (requestSpeed != -1) {
if (requestSpeed != currentSpeed().value() && requestSpeed >= 0 && requestSpeed <= 22) {
emit debug(QStringLiteral("writing speed ") + QString::number(requestSpeed));
forceSpeed(requestSpeed);
}
requestSpeed = -1;
}
break;
case 3:
writeCharacteristic(noOpData4, sizeof(noOpData4), QStringLiteral("noOp"));
break;
case 4:
writeCharacteristic(noOpData5, sizeof(noOpData5), QStringLiteral("noOp"));
break;
case 5:
writeCharacteristic(noOpData6, sizeof(noOpData6), QStringLiteral("noOp"));
if (requestStart != -1) {
emit debug(QStringLiteral("starting..."));
uint8_t start1[] = {0xfe, 0x02, 0x20, 0x03};
uint8_t start2[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x1c, 0x04, 0x1c, 0x02, 0x09,
0x00, 0x00, 0x40, 0x02, 0x18, 0x40, 0x00, 0x00, 0x80, 0x30};
uint8_t start3[] = {0xff, 0x0e, 0x2a, 0x00, 0x00, 0xef, 0x1a, 0x58, 0x02, 0x00,
0xb4, 0x00, 0x58, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00};
uint8_t start4[] = {0xfe, 0x02, 0x11, 0x02};
uint8_t start5[] = {0xff, 0x11, 0x02, 0x04, 0x02, 0x0d, 0x04, 0x0d, 0x02, 0x02,
0x03, 0x10, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xd2, 0x00};
writeCharacteristic(start1, sizeof(start1), QStringLiteral("start1"));
writeCharacteristic(start2, sizeof(start2), QStringLiteral("start2"));
writeCharacteristic(start3, sizeof(start3), QStringLiteral("start3"), false, true);
writeCharacteristic(start4, sizeof(start4), QStringLiteral("start4"));
writeCharacteristic(start5, sizeof(start5), QStringLiteral("start5"), false, true);
requestStart = -1;
emit tapeStarted();
}
if (requestStop != -1 || requestPause != -1) {
forceSpeed(0);
emit debug(QStringLiteral("stopping..."));
requestStop = -1;
requestPause = -1;
}
break;
}
counterPoll++;
if (counterPoll > 5) {
counterPoll = 0;
}
} else if (nordictrackt70 || proform_treadmill_sport_8_5) {
uint8_t noOpData1[] = {0xff, 0x05, 0x18, 0x00, 0x00, 0x01, 0x2f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
@@ -3478,6 +3559,7 @@ void proformtreadmill::btinit() {
proform_treadmill_995i = settings.value(QZSettings::proform_treadmill_995i, QZSettings::default_proform_treadmill_995i).toBool();
nordictrack_series_7 = settings.value(QZSettings::nordictrack_series_7, QZSettings::default_nordictrack_series_7).toBool();
proform_treadmill_sport_3_0 = settings.value(QZSettings::proform_treadmill_sport_3_0, QZSettings::default_proform_treadmill_sport_3_0).toBool();
proform_power_595i = settings.value(QZSettings::proform_power_595i, QZSettings::default_proform_power_595i).toBool();
if (proform_treadmill_995i) {
// ProForm 995i initialization frames from pkt4658 to pkt4756 (all 25 frames)
@@ -3589,6 +3671,104 @@ void proformtreadmill::btinit() {
QThread::msleep(sleepms);
writeCharacteristic(initData25, sizeof(initData25), QStringLiteral("init pkt4756"), false, false);
QThread::msleep(sleepms);
} else if (proform_power_595i) {
// ProForm Power 595i (PETL78719.0) initialization frames from frame 1782 to 1996
uint8_t init1[] = {0xfe, 0x02, 0x08, 0x02};
uint8_t init2[] = {0xff, 0x08, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x81, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init3[] = {0xfe, 0x02, 0x08, 0x02};
uint8_t init4[] = {0xff, 0x08, 0x02, 0x04, 0x02, 0x04, 0x04, 0x04, 0x80, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init5[] = {0xfe, 0x02, 0x08, 0x02};
uint8_t init6[] = {0xff, 0x08, 0x02, 0x04, 0x02, 0x04, 0x04, 0x04, 0x88, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init7[] = {0xfe, 0x02, 0x0b, 0x02};
uint8_t init8[] = {0xff, 0x0b, 0x02, 0x04, 0x02, 0x07, 0x02, 0x07, 0x82, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init9[] = {0xfe, 0x02, 0x0a, 0x02};
uint8_t init10[] = {0xff, 0x0a, 0x02, 0x04, 0x02, 0x06, 0x02, 0x06, 0x84, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init11[] = {0xfe, 0x02, 0x08, 0x02};
uint8_t init12[] = {0xff, 0x08, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x95, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init13[] = {0xfe, 0x02, 0x2c, 0x04};
uint8_t init14[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x28, 0x04, 0x28, 0x90, 0x07, 0x01, 0x80, 0x0c, 0x8a, 0x1e, 0xa4, 0x38, 0xb6, 0x5a, 0xe8};
uint8_t init15[] = {0x01, 0x12, 0x74, 0x02, 0xa6, 0x4c, 0xf0, 0x6e, 0x32, 0xd0, 0x7c, 0x1a, 0xae, 0x74, 0x08, 0xa6, 0x6a, 0x38, 0xc4, 0x92};
uint8_t init16[] = {0xff, 0x08, 0x56, 0x1c, 0xe0, 0x98, 0x02, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init17[] = {0xfe, 0x02, 0x19, 0x03};
uint8_t init18[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x15, 0x04, 0x15, 0x02, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init19[] = {0xff, 0x07, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init20[] = {0xfe, 0x02, 0x17, 0x03};
uint8_t init21[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x13, 0x04, 0x13, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init22[] = {0xff, 0x05, 0x00, 0x80, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init23[] = {0xfe, 0x02, 0x19, 0x03};
uint8_t init24[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x15, 0x04, 0x15, 0x02, 0x00, 0x0f, 0x00, 0x10, 0x00, 0xd8, 0x1c, 0x48, 0x00, 0x00, 0xe0};
uint8_t init25[] = {0xff, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init26[] = {0xfe, 0x02, 0x14, 0x03};
uint8_t init27[] = {0x00, 0x12, 0x02, 0x04, 0x02, 0x10, 0x04, 0x10, 0x02, 0x00, 0x0a, 0x1b, 0x94, 0x30, 0x00, 0x10, 0x40, 0x50, 0x00, 0x80};
uint8_t init28[] = {0xff, 0x02, 0x18, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t init29[] = {0xfe, 0x02, 0x11, 0x02};
uint8_t init30[] = {0xff, 0x11, 0x02, 0x04, 0x02, 0x0d, 0x04, 0x0d, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x08, 0x58, 0x02, 0x00, 0x7a, 0x00};
uint8_t init31[] = {0xfe, 0x02, 0x19, 0x03};
int sleepms = 400;
writeCharacteristic(init1, sizeof(init1), QStringLiteral("init1"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init2, sizeof(init2), QStringLiteral("init2"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init3, sizeof(init3), QStringLiteral("init3"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init4, sizeof(init4), QStringLiteral("init4"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init5, sizeof(init5), QStringLiteral("init5"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init6, sizeof(init6), QStringLiteral("init6"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init7, sizeof(init7), QStringLiteral("init7"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init8, sizeof(init8), QStringLiteral("init8"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init9, sizeof(init9), QStringLiteral("init9"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init10, sizeof(init10), QStringLiteral("init10"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init11, sizeof(init11), QStringLiteral("init11"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init12, sizeof(init12), QStringLiteral("init12"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init13, sizeof(init13), QStringLiteral("init13"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init14, sizeof(init14), QStringLiteral("init14"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init15, sizeof(init15), QStringLiteral("init15"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init16, sizeof(init16), QStringLiteral("init16"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init17, sizeof(init17), QStringLiteral("init17"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init18, sizeof(init18), QStringLiteral("init18"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init19, sizeof(init19), QStringLiteral("init19"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init20, sizeof(init20), QStringLiteral("init20"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init21, sizeof(init21), QStringLiteral("init21"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init22, sizeof(init22), QStringLiteral("init22"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init23, sizeof(init23), QStringLiteral("init23"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init24, sizeof(init24), QStringLiteral("init24"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init25, sizeof(init25), QStringLiteral("init25"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init26, sizeof(init26), QStringLiteral("init26"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init27, sizeof(init27), QStringLiteral("init27"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init28, sizeof(init28), QStringLiteral("init28"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init29, sizeof(init29), QStringLiteral("init29"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init30, sizeof(init30), QStringLiteral("init30"), false, false);
QThread::msleep(sleepms);
writeCharacteristic(init31, sizeof(init31), QStringLiteral("init31"), false, false);
QThread::msleep(sleepms);
} else if (nordictrack_series_7) {
// NordicTrack Series 7 initialization frames (36 packets: pkt526 to pkt709)
uint8_t initData1[4] = {0xfe, 0x02, 0x08, 0x02};

View File

@@ -118,6 +118,7 @@ class proformtreadmill : public treadmill {
bool proform_treadmill_995i = false;
bool nordictrack_series_7 = false;
bool proform_treadmill_sport_3_0 = false;
bool proform_power_595i = false;
#ifdef Q_OS_IOS
lockscreen *h = 0;

View File

@@ -257,6 +257,7 @@ const QString QZSettings::proform_treadmill_995i = QStringLiteral("proform_tread
const QString QZSettings::nordictrack_series_7 = QStringLiteral("nordictrack_series_7");
const QString QZSettings::nordictrack_se7i = QStringLiteral("nordictrack_se7i");
const QString QZSettings::proform_treadmill_sport_3_0 = QStringLiteral("proform_treadmill_sport_3_0");
const QString QZSettings::proform_power_595i = QStringLiteral("proform_power_595i");
const QString QZSettings::toorx_3_0 = QStringLiteral("toorx_3_0");
const QString QZSettings::toorx_65s_evo = QStringLiteral("toorx_65s_evo");
const QString QZSettings::jtx_fitness_sprint_treadmill = QStringLiteral("jtx_fitness_sprint_treadmill");
@@ -1047,7 +1048,7 @@ const QString QZSettings::skandika_wiri_x2000_protocol = QStringLiteral("skandik
const QString QZSettings::trainprogram_auto_lap_on_segment = QStringLiteral("trainprogram_auto_lap_on_segment");
const uint32_t allSettingsCount = 853;
const uint32_t allSettingsCount = 854;
QVariant allSettings[allSettingsCount][2] = {
{QZSettings::cryptoKeySettingsProfiles, QZSettings::default_cryptoKeySettingsProfiles},
@@ -1918,6 +1919,7 @@ QVariant allSettings[allSettingsCount][2] = {
{QZSettings::trainprogram_auto_lap_on_segment, QZSettings::default_trainprogram_auto_lap_on_segment},
{QZSettings::toorxtreadmill_discovery_completed, QZSettings::default_toorxtreadmill_discovery_completed},
{QZSettings::proform_treadmill_sport_3_0, QZSettings::default_proform_treadmill_sport_3_0},
{QZSettings::proform_power_595i, QZSettings::default_proform_power_595i},
{QZSettings::garmin_oauth1_token, QZSettings::default_garmin_oauth1_token},
{QZSettings::garmin_oauth1_token_secret, QZSettings::default_garmin_oauth1_token_secret},
};

View File

@@ -750,6 +750,8 @@ class QZSettings {
static constexpr bool default_nordictrack_se7i = false;
static const QString proform_treadmill_sport_3_0;
static constexpr bool default_proform_treadmill_sport_3_0 = false;
static const QString proform_power_595i;
static constexpr bool default_proform_power_595i = false;
static const QString toorx_3_0;
static constexpr bool default_toorx_3_0 = false;

View File

@@ -1270,6 +1270,7 @@ import Qt.labs.platform 1.1
property int tile_power_avg_order: 77
property bool life_fitness_ic5: false
property bool technogym_bike: false
property bool proform_power_595i: false
}
@@ -8498,6 +8499,7 @@ import Qt.labs.platform 1.1
"NordicTrack Series 7",
"Proform Trainer 9.0 (PFTL69921-INT.4)",
"Proform Sport 3.0",
"Proform Power 595i",
]
// Initialize when the accordion content becomes visible
@@ -8569,7 +8571,8 @@ import Qt.labs.platform 1.1
settings.proform_treadmill_995i ? 52 :
settings.nordictrack_series_7 ? 53 :
settings.proform_trainer_9_0 ? 54 :
settings.proform_treadmill_sport_3_0 ? 55 : 0;
settings.proform_treadmill_sport_3_0 ? 55 :
settings.proform_power_595i ? 56 : 0;
console.log("treadmillModelComboBox selected model: " + selectedModel);
if (selectedModel >= 0) {
@@ -8639,6 +8642,7 @@ import Qt.labs.platform 1.1
settings.nordictrack_series_7 = false;
settings.proform_trainer_9_0 = false;
settings.proform_treadmill_sport_3_0 = false;
settings.proform_power_595i = false;
// Set new setting based on selection
switch (currentIndex) {
@@ -8697,6 +8701,7 @@ import Qt.labs.platform 1.1
case 53: settings.nordictrack_series_7 = true; break;
case 54: settings.proform_trainer_9_0 = true; break;
case 55: settings.proform_treadmill_sport_3_0 = true; break;
case 56: settings.proform_power_595i = true; break;
}
window.settings_restart_to_apply = true;