140 : AbstractPokitService(d,
parent)
155 return (r1 && r2 && r3 && r4 && r5);
253 return (characteristic.
isValid())
341 if (!characteristic.
isValid()) {
346 if (value.
length() > 11) {
347 qCWarning(d->lc).noquote() <<
tr(R
"(Device name "%1" is too long (%2 > 11 bytes): 0x3)")
352 d->service->writeCharacteristic(characteristic, value);
353 return (d->service->error() != QLowEnergyService::ServiceError::CharacteristicWriteError);
376 if (!characteristic.
isValid()) {
385 d->service->writeCharacteristic(characteristic, value);
386 return (d->service->error() != QLowEnergyService::ServiceError::CharacteristicWriteError);
416 if (!characteristic.
isValid()) {
421 d->service->writeCharacteristic(characteristic, value);
422 return (d->service->error() != QLowEnergyService::ServiceError::CharacteristicWriteError);
586 Q_ASSERT(characteristics.firmwareVersion.isNull());
588 if (!
checkSize(u
"Device Characteristics"_s, value, 20, 20)) {
589 return characteristics;
594 qFromLittleEndian<quint8 >(value.
mid(1,1).
constData()));
595 characteristics.maximumVoltage = qFromLittleEndian<quint16>(value.
mid(2,2).
constData());
596 characteristics.maximumCurrent = qFromLittleEndian<quint16>(value.
mid(4,2).
constData());
597 characteristics.maximumResistance = qFromLittleEndian<quint16>(value.
mid(6,2).
constData());
598 characteristics.maximumSamplingRate = qFromLittleEndian<quint16>(value.
mid(8,2).
constData());
599 characteristics.samplingBufferSize = qFromLittleEndian<quint16>(value.
mid(10,2).
constData());
600 characteristics.capabilityMask = qFromLittleEndian<quint16>(value.
mid(12,2).
constData());
604 qCDebug(lc).noquote() <<
tr(
"Firmware version: ") << characteristics.firmwareVersion;
605 qCDebug(lc).noquote() <<
tr(
"Maximum voltage: ") << characteristics.maximumVoltage;
606 qCDebug(lc).noquote() <<
tr(
"Maximum current: ") << characteristics.maximumCurrent;
607 qCDebug(lc).noquote() <<
tr(
"Maximum resistance: ") << characteristics.maximumResistance;
608 qCDebug(lc).noquote() <<
tr(
"Maximum sampling rate:") << characteristics.maximumSamplingRate;
609 qCDebug(lc).noquote() <<
tr(
"Sampling buffer size: ") << characteristics.samplingBufferSize;
610 qCDebug(lc).noquote() <<
tr(
"Capability mask: ") << characteristics.capabilityMask;
611 qCDebug(lc).noquote() <<
tr(
"MAC address: ") << characteristics.macAddress;
613 Q_ASSERT(!characteristics.firmwareVersion.isNull());
614 return characteristics;
626 (std::numeric_limits<std::underlying_type_t<StatusService::DeviceStatus>>::max()),
627 std::numeric_limits<float>::quiet_NaN(),
629 (std::numeric_limits<std::underlying_type_t<StatusService::BatteryStatus>>::max()),
630 std::nullopt, std::nullopt,
641 if (!
checkSize(u
"Status"_s, value, 5, 8)) {
646 status.batteryVoltage = qFromLittleEndian<float>(value.
mid(1,4).
constData());
647 if (value.
size() >= 6) {
650 if (value.
size() >= 7) {
653 if (value.
size() >= 8) {
656 qCDebug(lc).noquote() <<
tr(
"Device status: %1 (%2)")
658 qCDebug(lc).noquote() <<
tr(
"Battery voltage: %1 volts").
arg(status.batteryVoltage);
659 qCDebug(lc).noquote() <<
tr(
"Battery status: %1 (%2)")
661 if (status.switchPosition) {
662 qCDebug(lc).noquote() <<
tr(
"Switch position: %1 (%2)")
665 if (status.chargingStatus) {
666 qCDebug(lc).noquote() <<
tr(
"Charging status: %1 (%2)")
677 if (!
checkSize(u
"Torch"_s, value, 1, 1)) {
691 if (!
checkSize(u
"Torch"_s, value, 2, 2)) {
718 qCDebug(lc).noquote() <<
tr(
"Found Status Service for a Pokit Meter device.");
721 qCDebug(lc).noquote() <<
tr(
"Found Status Service for a Pokit Pro device.");
749 qCDebug(lc).noquote() <<
tr(R
"(Device name: "%1")").arg(deviceName);
750 Q_EMIT q->deviceNameRead(deviceName);
755 qCWarning(lc).noquote() <<
tr(
"Flash LED characteristic is write-only, but somehow read")
761 if (!
checkSize(u
"Torch"_s, value, 1, 1)) {
766 Q_EMIT q->torchStatusRead(status);
771 if (!
checkSize(u
"Torch"_s, value, 2, 2)) {
776 Q_EMIT q->buttonPressRead(value.
at(0), status);
780 qCWarning(lc).noquote() <<
tr(
"Unknown characteristic read for Status service")
795 qCWarning(lc).noquote() <<
tr(
"Device Characteristics is read-only, but somehow written")
801 qCWarning(lc).noquote() <<
tr(
"Status characteristic is read-only, but somehow written")
807 Q_EMIT q->deviceNameWritten();
812 Q_EMIT q->deviceLedFlashed();
817 Q_EMIT q->torchStatusWritten();
821 qCWarning(lc).noquote() <<
tr(
"Unknown characteristic written for Status service")
QBluetoothUuid serviceUuid
UUIDs for service.
virtual void serviceDiscovered(const QBluetoothUuid &newService)
Handles QLowEnergyController::serviceDiscovered events.
AbstractPokitServicePrivate(const QBluetoothUuid &serviceUuid, QLowEnergyController *controller, AbstractPokitService *const q)
virtual void characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
Handles QLowEnergyService::characteristicRead events.
virtual void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Handles QLowEnergyService::characteristicWritten events.
QLowEnergyController * controller
BLE controller to fetch the service from.
static bool checkSize(const QString &label, const QByteArray &data, const int minSize, const int maxSize=-1, const bool failOnMax=false)
Returns false if data is smaller than minSize, otherwise returns failOnMax if data is bigger than max...
QLowEnergyService * service()
Returns a non-const pointer to the internal service object, if any.
The StatusServicePrivate class provides private implementation for StatusService.
void characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) override
Implements AbstractPokitServicePrivate::characteristicRead to parse value, then emit a specialised si...
StatusServicePrivate(QLowEnergyController *controller, StatusService *const q)
static StatusService::Status parseStatus(const QByteArray &value)
Parses the Status value into a Status struct.
void serviceDiscovered(const QBluetoothUuid &newService) override
Handles QLowEnergyController::serviceDiscovered events.
static StatusService::DeviceCharacteristics parseDeviceCharacteristics(const QByteArray &value)
Parses the Device Characteristics value into a DeviceCharacteristics struct.
void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) override
Implements AbstractPokitServicePrivate::characteristicWritten to parse newValue, then emit a speciali...
static std::optional< StatusService::ButtonStatus > parseButtonPress(const QByteArray &value)
Parses the button press value, and returns the corresponding ButtonStatus.
static std::optional< StatusService::TorchStatus > parseTorchStatus(const QByteArray &value)
Parses the torch status value, and returns the corresponding TorchStatus.
The StatusService class accesses the Pokit Status service of Pokit devices.
DeviceCharacteristics deviceCharacteristics() const
Returns the most recent value of the Status service's Device Characteristics characteristic.
bool enableButtonPressedNotifications()
Enables client-side notifications of button presses.
bool readStatusCharacteristic()
Read the Status service's Status characteristic.
StatusService(QLowEnergyController *const pokitDevice, QObject *parent=nullptr)
Constructs a new Pokit service with parent.
QString deviceName() const
Returns the most recent value of the Status services's Device Name characteristic.
ButtonStatus
Values supported by the second byte of the attribute of the (undocumented) Button Press characteristi...
@ Pressed
Button was pressed.
@ Released
Button was released.
@ Held
Button was held down (for typically 1,500ms).
bool readNameCharacteristic()
Read the Status service's Name characteristic.
bool disableStatusNotifications()
Disables client-side notifications of device status changes.
BatteryStatus
Values supported by the Battery Status attribute of the Status characteristic.
@ Low
Low (replace battery).
bool readButtonPressCharacteristic()
Read the Status service's (undocumented) Button Press characteristic.
bool setTorchStatus(const TorchStatus status)
Set the Pokit device's torch to status.
bool flashLed()
Flash the Pokit device's LED.
DeviceStatus
Values supported by the Status attribute of the Status characteristic.
@ MultimeterContinuity
Multimeter is measuring continuity.
@ MultimeterAcCurrent
Multimeter is measuring AC current.
@ LoggerModeSampling
Data Logger is sampling.
@ MultimeterDcVoltage
Multimeter is measuring DC voltage.
@ DsoModeSampling
DSO is sampling.
@ MultimeterDcCurrent
Multimeter is measuring DC current.
@ MultimeterTemperature
Multimeter is measuring temperature.
@ MultimeterResistance
Multimeter is measuring resistance.
@ MultimeterDiode
Multimeter is measuring diode.
@ MultimeterAcVoltage
Multimeter is measuring AC voltage.
bool enableStatusNotifications()
Enables client-side notifications of device status changes.
std::optional< ButtonStatus > buttonPress() const
Returns the most recent value of the Status services's Button Press characteristic.
bool enableTorchStatusNotifications()
Enables client-side notifications of torch status changes.
SwitchPosition
Values supported by the (undocumented) Switch Position attribute of the Status characteristic.
@ HighCurrent
Device is switched to High Current position.
@ Voltage
Device is switched to Voltage position.
@ MultiMode
Device is switched to Resistance / Low Current / Capacitance / Diode position.
bool disableTorchStatusNotifications()
Disables client-side notifications of torch status changes.
static QString toString(const StatusService::DeviceStatus &status)
Returns a string version of the status enum label.
bool disableButtonPressedNotifications()
Disables client-side notifications of button presses.
TorchStatus
Values supported by the single byte of the attribute of the (undocumented) Torch characteristic.
std::optional< TorchStatus > torchStatus() const
Returns the most recent value of the Status services's Torch characteristic.
bool readCharacteristics() override
Read all characteristics.
bool setDeviceName(const QString &name)
Set's the Pokit device's name to name.
bool readDeviceCharacteristics()
Read the Status service's Device Characteristics characteristic.
Status status() const
Returns the most recent value of the Status service's Status characteristic.
ChargingStatus
Values supported by the (undocumented) Charging Statue attribute of the Status characteristic.
@ Discharging
Battery is discharging.
@ Charged
Battery is fully charged.
@ Charging
Battery is being charged.
bool readTorchCharacteristic()
Read the Status service's (undocumented) Torch characteristic.
char at(int i) const const
const char * constData() const const
QByteArray mid(int pos, int len) const const
QByteArray toHex() const const
bool isValid() const const
QString name() const const
QBluetoothUuid uuid() const const
QByteArray value() const const
QLowEnergyCharacteristic characteristic(const QBluetoothUuid &uuid) const const
QObject * parent() const const
QString tr(const char *sourceText, const char *disambiguation, int n)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromUtf8(const char *str, int size)
QByteArray toUtf8() const const
#define QTPOKIT_BEGIN_NAMESPACE
Macro for starting the QtPokit library's top-most namespace (if one is defined).
#define QTPOKIT_END_NAMESPACE
Macro for ending the QtPokit library's top-most namespace (if one is defined).
Declares the StatusService class.
Declares the StatusServicePrivate class.
Declares the DOKIT_USE_STRINGLITERALS macro, and related functions.
#define DOKIT_USE_STRINGLITERALS
Internal macro for using either official Qt string literals (added in Qt 6.4), or our own equivalent ...
static const QBluetoothUuid name
UUID of the Pokit Status service's Device Name characteristic.
static const QBluetoothUuid torch
UUID of the Pokit Status service's (undocumented) Torch characteristic.
static const QBluetoothUuid deviceCharacteristics
UUID of the Pokit Status service's Device Characteristics characteristic.
static const QBluetoothUuid buttonPress
UUID of the Pokit Status service's (undocumented) Button Press characteristic.
static const QBluetoothUuid flashLed
UUID of the Pokit Status service's Flash LED characteristic.
static const QBluetoothUuid status
UUID of the Pokit Status service's Status characteristic.
Attributes included in the Device Characteristics characteristic.
static const QBluetoothUuid pokitPro
UUID of the Pokit Pro's Pokit Status service.
static const QBluetoothUuid pokitMeter
UUID of the Pokit Meter's Pokit Status service.
Attributes included in the Status characteristic.
DeviceStatus deviceStatus
Current Pokit device status.