mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 23:13:25 +00:00
cd55344410
Because some BLE operations can be very slow (device and service discovery etc), we have some rather excessive default timeout for BLE (currently set to 12 seconds). But once we actually have started doing IO, that long timeout can be a big performance problem, when the libdivecomputer backend has support for retry and packet loss. For that reason, libdivecomputer has a 'set_timeout()' function that allows the divecomputer backend to say how quickly it expects the dive computer to answer before the backend will start resending packets. Let's just implement that for the actual IO side of BLE too. The default timeout value remains the general BLE timeout, and this only affects the actual IO phase, but it improves things enormously for the case where there is packet loss at that point. For example, on the Aqualung i770R, the timeout for packet loss ends up now being just one second rather than the full 12 seconds of default BLE timeout. Which gets the retry going much faster. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
68 lines
2.3 KiB
C++
68 lines
2.3 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef QT_BLE_H
|
|
#define QT_BLE_H
|
|
|
|
#include <stddef.h>
|
|
#include "core/libdivecomputer.h"
|
|
#include <QVector>
|
|
#include <QLowEnergyController>
|
|
#include <QEventLoop>
|
|
|
|
#define HW_OSTC_BLE_DATA_RX 0
|
|
#define HW_OSTC_BLE_DATA_TX 1
|
|
#define HW_OSTC_BLE_CREDITS_RX 2
|
|
#define HW_OSTC_BLE_CREDITS_TX 3
|
|
|
|
class BLEObject : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
BLEObject(QLowEnergyController *c, dc_user_device_t *);
|
|
~BLEObject();
|
|
inline void set_timeout(int value) { timeout = value; }
|
|
dc_status_t write(const void* data, size_t size, size_t *actual);
|
|
dc_status_t read(void* data, size_t size, size_t *actual);
|
|
|
|
inline QLowEnergyService *preferredService() { return preferred; }
|
|
inline int descriptorWritten() { return desc_written; }
|
|
dc_status_t select_preferred_service(void);
|
|
|
|
public slots:
|
|
void addService(const QBluetoothUuid &newService);
|
|
void serviceStateChanged(QLowEnergyService::ServiceState s);
|
|
void characteristcStateChanged(const QLowEnergyCharacteristic &c, const QByteArray &value);
|
|
void characteristicWritten(const QLowEnergyCharacteristic &c, const QByteArray &value);
|
|
void writeCompleted(const QLowEnergyDescriptor &d, const QByteArray &value);
|
|
dc_status_t setupHwTerminalIo(QList<QLowEnergyCharacteristic>);
|
|
dc_status_t setHwCredit(unsigned int c);
|
|
private:
|
|
QVector<QLowEnergyService *> services;
|
|
|
|
QLowEnergyController *controller = nullptr;
|
|
QLowEnergyService *preferred = nullptr;
|
|
QList<QByteArray> receivedPackets;
|
|
bool isCharacteristicWritten;
|
|
dc_user_device_t *device;
|
|
unsigned int hw_credit = 0;
|
|
unsigned int desc_written = 0;
|
|
int timeout;
|
|
|
|
QList<QUuid> hwAllCharacteristics = {
|
|
"{00000001-0000-1000-8000-008025000000}", // HW_OSTC_BLE_DATA_RX
|
|
"{00000002-0000-1000-8000-008025000000}", // HW_OSTC_BLE_DATA_TX
|
|
"{00000003-0000-1000-8000-008025000000}", // HW_OSTC_BLE_CREDITS_RX
|
|
"{00000004-0000-1000-8000-008025000000}" // HW_OSTC_BLE_CREDITS_TX
|
|
};
|
|
};
|
|
|
|
|
|
extern "C" {
|
|
dc_status_t qt_ble_open(void **io, dc_context_t *context, const char *devaddr, dc_user_device_t *user_device);
|
|
dc_status_t qt_ble_set_timeout(void *io, int timeout);
|
|
dc_status_t qt_ble_read(void *io, void* data, size_t size, size_t *actual);
|
|
dc_status_t qt_ble_write(void *io, const void* data, size_t size, size_t *actual);
|
|
dc_status_t qt_ble_close(void *io);
|
|
}
|
|
|
|
#endif
|