Compare commits

...

5 Commits

Author SHA1 Message Date
Roberto Viola
2f9938d239 Merge branch 'master' into garmin_and_raspberry 2024-01-02 12:21:16 +01: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
3 changed files with 122 additions and 12 deletions

View File

@@ -12,7 +12,6 @@ using namespace std::chrono_literals;
virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHeartService, uint8_t bikeResistanceOffset,
double bikeResistanceGain) {
Bike = t;
this->noHeartService = noHeartService;
this->bikeResistanceGain = bikeResistanceGain;
this->bikeResistanceOffset = bikeResistanceOffset;
@@ -92,7 +91,7 @@ virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHear
services << QBluetoothUuid::HeartRate;
}
services << ((QBluetoothUuid::ServiceClassUuid)0xFF00);
// services << ((QBluetoothUuid::ServiceClassUuid)0xFF00);
} else if (ifit) {
services << (QBluetoothUuid(QStringLiteral("00001533-1412-efde-1523-785feabcd123")));
@@ -196,15 +195,56 @@ virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHear
serviceDataFIT.addCharacteristic(charDataFIT5);
serviceDataFIT.addCharacteristic(charDataFIT6);
} else if (power) {
QLowEnergyCharacteristicData charDataFIT;
charDataFIT.setUuid(
(QBluetoothUuid::CharacteristicType)0x2A00); // FitnessMachineFeatureCharacteristicUuid
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); // FitnessMachineFeatureCharacteristicUuid
QByteArray valueFIT2;
valueFIT2.append((char)0x00);
charDataFIT2.setValue(valueFIT2);
charDataFIT2.setProperties(QLowEnergyCharacteristic::Read);
serviceDataFIT.setUuid((QBluetoothUuid::ServiceClassUuid)0x1800); // FitnessMachineServiceUuid
serviceDataFIT.addCharacteristic(charDataFIT);
serviceDataFIT.addCharacteristic(charDataFIT2);
QLowEnergyCharacteristicData charDataFIT3;
charDataFIT3.setUuid(
(QBluetoothUuid::CharacteristicType)0x2A05); // FitnessMachineFeatureCharacteristicUuid
charDataFIT3.setProperties(QLowEnergyCharacteristic::Indicate);
QByteArray descriptor33;
descriptor33.append((char)0x02);
descriptor33.append((char)0x00);
const QLowEnergyDescriptorData clientConfig43(QBluetoothUuid::ClientCharacteristicConfiguration,
descriptor33);
charDataFIT3.addDescriptor(clientConfig43);
serviceEchelon.setUuid((QBluetoothUuid::ServiceClassUuid)0x1801); // FitnessMachineServiceUuid
serviceEchelon.addCharacteristic(charDataFIT3);
QLowEnergyCharacteristicData charData;
charData.setUuid(QBluetoothUuid::CharacteristicType::CyclingPowerFeature);
charData.setProperties(QLowEnergyCharacteristic::Read);
QByteArray value;
value.append((char)0x08); // crank supported
value.append((char)0x00);
value.append((char)0x00); // crank supported
value.append((char)0x00);
value.append((char)0x00);
value.append((char)0x08);
charData.setValue(value);
QLowEnergyCharacteristicData charData2;
@@ -220,6 +260,7 @@ virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHear
QLowEnergyCharacteristicData charData3;
charData3.setUuid(QBluetoothUuid::CharacteristicType::CyclingPowerMeasurement);
charData3.setProperties(QLowEnergyCharacteristic::Notify | QLowEnergyCharacteristic::Read);
charData3.setValue(valueLocaltion);
QByteArray descriptor;
descriptor.append((char)0x01);
descriptor.append((char)0x00);
@@ -230,8 +271,8 @@ virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHear
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::CyclingPower);
serviceData.addCharacteristic(charData);
serviceData.addCharacteristic(charData3);
serviceData.addCharacteristic(charData2);
serviceData.addCharacteristic(charData3);
} else {
QLowEnergyCharacteristicData charData;
@@ -393,6 +434,8 @@ virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHear
serviceFIT = leController->addService(serviceDataFIT);
} else {
serviceFIT = leController->addService(serviceDataFIT);
service = leController->addService(serviceEchelon);
service = leController->addService(serviceData);
}
}
@@ -434,10 +477,30 @@ virtualbike::virtualbike(bluetoothdevice *t, bool noWriteResistance, bool noHear
settings.value(QZSettings::bluetooth_relaxed, QZSettings::default_bluetooth_relaxed).toBool();
QLowEnergyAdvertisingParameters pars = QLowEnergyAdvertisingParameters();
if (!bluetooth_relaxed) {
pars.setInterval(100, 100);
}
pars.setInterval(30, 50);
leController->startAdvertising(pars, advertisingData, advertisingData);
QByteArray a;
a.append(0x02);
a.append(0x01);
a.append(0x06);
a.append(0x03);
a.append(0x03);
a.append(0x18);
a.append(0x18);
a.append(0x09);
a.append(0x09);
a.append(0x50);
a.append(0x69);
a.append(0x78);
a.append(0x65);
a.append(0x6c);
a.append(0x20);
a.append(0x36);
a.append(0x61);
advertisingData.setRawData(a);
leController->startAdvertising(pars, advertisingData);
//! [Start Advertising]
}

View File

@@ -65,8 +65,6 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
services << QBluetoothUuid::HeartRate;
}
services << ((QBluetoothUuid::ServiceClassUuid)0xFF00);
advertisingData.setServices(services);
//! [Advertising Data]
@@ -170,6 +168,45 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
}
if (RSCEnable()) {
QLowEnergyCharacteristicData charDataFIT;
charDataFIT.setUuid((QBluetoothUuid::CharacteristicType)0x2A00); // FitnessMachineFeatureCharacteristicUuid
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); // FitnessMachineFeatureCharacteristicUuid
QByteArray valueFIT2;
valueFIT2.append((char)0x00);
charDataFIT2.setValue(valueFIT2);
charDataFIT2.setProperties(QLowEnergyCharacteristic::Read);
serviceDataFIT.setUuid((QBluetoothUuid::ServiceClassUuid)0x1800); // FitnessMachineServiceUuid
serviceDataFIT.addCharacteristic(charDataFIT);
serviceDataFIT.addCharacteristic(charDataFIT2);
QLowEnergyCharacteristicData charDataFIT3;
charDataFIT3.setUuid((QBluetoothUuid::CharacteristicType)0x2A05); // FitnessMachineFeatureCharacteristicUuid
charDataFIT3.setProperties(QLowEnergyCharacteristic::Indicate);
QByteArray descriptor33;
descriptor33.append((char)0x02);
descriptor33.append((char)0x00);
const QLowEnergyDescriptorData clientConfig43(QBluetoothUuid::ClientCharacteristicConfiguration,
descriptor33);
charDataFIT3.addDescriptor(clientConfig43);
serviceEchelon.setUuid((QBluetoothUuid::ServiceClassUuid)0x1801); // FitnessMachineServiceUuid
serviceEchelon.addCharacteristic(charDataFIT3);
QLowEnergyCharacteristicData charData;
charData.setUuid(QBluetoothUuid::CharacteristicType::RSCFeature);
charData.setProperties(QLowEnergyCharacteristic::Read);
@@ -191,6 +228,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 +270,11 @@ virtualtreadmill::virtualtreadmill(bluetoothdevice *t, bool noHeartService) {
Q_ASSERT(leController);
if (ftmsServiceEnable())
serviceFTMS = leController->addService(serviceDataFTMS);
if (RSCEnable())
if (RSCEnable()) {
serviceRSC = leController->addService(serviceDataRSC);
serviceFIT = leController->addService(serviceDataFIT);
service = leController->addService(serviceEchelon);
}
if (noHeartService == false) {
serviceHR = leController->addService(serviceDataHR);
}
@@ -246,10 +287,12 @@ 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);
pars.setInterval(30, 50);
leController->startAdvertising(pars, advertisingData);
//! [Start Advertising]
//! [Provide Heartbeat]

View File

@@ -41,10 +41,14 @@ class virtualtreadmill : public virtualdevice {
QLowEnergyService *serviceFTMS = nullptr;
QLowEnergyService *serviceRSC = nullptr;
QLowEnergyService *serviceHR = nullptr;
QLowEnergyService *serviceFIT = nullptr;
QLowEnergyService *service = nullptr;
QLowEnergyAdvertisingData advertisingData;
QLowEnergyServiceData serviceDataFTMS;
QLowEnergyServiceData serviceDataRSC;
QLowEnergyServiceData serviceDataHR;
QLowEnergyServiceData serviceDataFIT;
QLowEnergyServiceData serviceEchelon;
QTimer treadmillTimer;
bluetoothdevice *treadMill;