Compare commits

...

11 Commits

Author SHA1 Message Date
Roberto Viola
dd3327bdfa Update virtualtreadmill.cpp 2024-01-07 09:09:20 +00:00
Roberto Viola
89b9dd997b Update virtualtreadmill.cpp 2024-01-07 09:45:28 +01:00
Roberto Viola
10baf6f4b6 code cleaned 2024-01-03 09:37:11 +01:00
Roberto Viola
0095c73cad Merge branch 'master' into peloton_raspberry_treadmill 2024-01-03 09:27:06 +01:00
Roberto Viola
39fc5b7f17 restoring back virtualbike.cpp 2024-01-03 09:26:48 +01:00
Roberto Viola
a9be92d695 Merge remote-tracking branch 'origin/master' into peloton_raspberry_treadmill 2023-12-28 07:39:55 +00:00
Roberto Viola
d353a044c0 adding 1800 and 1801 2023-12-27 06:00:56 +00:00
Roberto Viola
2fee48db83 Update virtualtreadmill.cpp 2023-04-12 11:56:29 +02:00
Roberto Viola
209194ce55 fix on RSC 2023-04-03 10:28:27 +02:00
Roberto Viola
7cdf150ca6 added the garmin workaround also for the rsc sensor 2023-03-28 14:43:18 +02:00
Roberto Viola
cdb10cd2f0 works! 2023-03-15 15:06:18 +01:00
2 changed files with 68 additions and 5 deletions

View File

@@ -65,8 +65,6 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
services << QBluetoothUuid::HeartRate;
}
services << ((QBluetoothUuid::ServiceClassUuid)0xFF00);
advertisingData.setServices(services);
//! [Advertising Data]
@@ -169,6 +167,48 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
serviceDataFTMS.addCharacteristic(charDataFIT2);
}
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
qDebug() << "Raspberry workaround for sending metrics to the peloton app";
QLowEnergyCharacteristicData charDataFIT;
charDataFIT.setUuid((QBluetoothUuid::CharacteristicType)0x2A00);
QByteArray valueFIT;
valueFIT.append((char)'P'); // average speed, cadence and resistance level supported
valueFIT.append((char)'i'); // heart rate and elapsed time
valueFIT.append((char)'x');
valueFIT.append((char)'e');
valueFIT.append((char)'l'); // resistance and power target supported
valueFIT.append((char)' '); // indoor simulation, wheel and spin down supported
valueFIT.append((char)'6');
valueFIT.append((char)'a');
valueFIT.append((char)0x00);
charDataFIT.setValue(valueFIT);
charDataFIT.setProperties(QLowEnergyCharacteristic::Read);
QLowEnergyCharacteristicData charDataFIT2;
charDataFIT2.setUuid((QBluetoothUuid::CharacteristicType)0x2A01);
QByteArray valueFIT2;
valueFIT2.append((char)0x00);
charDataFIT2.setValue(valueFIT2);
charDataFIT2.setProperties(QLowEnergyCharacteristic::Read);
genericAccessServerData.setUuid((QBluetoothUuid::ServiceClassUuid)0x1800);
genericAccessServerData.addCharacteristic(charDataFIT);
genericAccessServerData.addCharacteristic(charDataFIT2);
QLowEnergyCharacteristicData charDataFIT3;
charDataFIT3.setUuid((QBluetoothUuid::CharacteristicType)0x2A05);
charDataFIT3.setProperties(QLowEnergyCharacteristic::Indicate);
QByteArray descriptor33;
descriptor33.append((char)0x02);
descriptor33.append((char)0x00);
const QLowEnergyDescriptorData clientConfig43(QBluetoothUuid::ClientCharacteristicConfiguration,
descriptor33);
charDataFIT3.addDescriptor(clientConfig43);
genericAttributeServiceData.setUuid((QBluetoothUuid::ServiceClassUuid)0x1801);
genericAttributeServiceData.addCharacteristic(charDataFIT3);
#endif
if (RSCEnable()) {
QLowEnergyCharacteristicData charData;
charData.setUuid(QBluetoothUuid::CharacteristicType::RSCFeature);
@@ -191,6 +231,7 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
QLowEnergyCharacteristicData charData3;
charData3.setUuid(QBluetoothUuid::CharacteristicType::RSCMeasurement);
charData3.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify);
charData3.setValue(valueLocaltion);
QByteArray descriptor;
descriptor.append((char)0x01);
descriptor.append((char)0x00);
@@ -232,8 +273,14 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
Q_ASSERT(leController);
if (ftmsServiceEnable())
serviceFTMS = leController->addService(serviceDataFTMS);
if (RSCEnable())
if (RSCEnable()) {
serviceRSC = leController->addService(serviceDataRSC);
}
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
genericAccessServer = leController->addService(genericAccessServerData);
genericAttributeService = leController->addService(genericAttributeServiceData);
#endif
if (noHeartService == false) {
serviceHR = leController->addService(serviceDataHR);
}
@@ -246,10 +293,13 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
settings.value(QZSettings::bluetooth_relaxed, QZSettings::default_bluetooth_relaxed).toBool();
QLowEnergyAdvertisingParameters pars = QLowEnergyAdvertisingParameters();
if (!bluetooth_relaxed) {
pars.setInterval(100, 100);
}
leController->startAdvertising(pars, advertisingData, advertisingData);
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
pars.setInterval(30, 50);
leController->startAdvertising(pars, advertisingData);
#endif
//! [Start Advertising]
//! [Provide Heartbeat]
@@ -318,6 +368,11 @@ void virtualtreadmill::reconnect() {
if (RSCEnable())
serviceRSC = leController->addService(serviceDataRSC);
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
genericAccessServer = leController->addService(genericAccessServerData);
genericAttributeService = leController->addService(genericAttributeServiceData);
#endif
if (noHeartService == false) {
serviceHR = leController->addService(serviceDataHR);
}

View File

@@ -41,10 +41,18 @@ class virtualtreadmill : public virtualdevice {
QLowEnergyService *serviceFTMS = nullptr;
QLowEnergyService *serviceRSC = nullptr;
QLowEnergyService *serviceHR = nullptr;
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
QLowEnergyService *genericAccessServer = nullptr;
QLowEnergyService *genericAttributeService = nullptr;
#endif
QLowEnergyAdvertisingData advertisingData;
QLowEnergyServiceData serviceDataFTMS;
QLowEnergyServiceData serviceDataRSC;
QLowEnergyServiceData serviceDataHR;
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
QLowEnergyServiceData genericAccessServerData;
QLowEnergyServiceData genericAttributeServiceData;
#endif
QTimer treadmillTimer;
bluetoothdevice *treadMill;