Dokit
Internal development documentation
Loading...
Searching...
No Matches
DsoServicePrivate Class Reference

The DsoServicePrivate class provides private implementation for DsoService. More...

Inheritance diagram for DsoServicePrivate:
[legend]
Collaboration diagram for DsoServicePrivate:
[legend]

Public Member Functions

 DsoServicePrivate (QLowEnergyController *controller, DsoService *const q)
Public Member Functions inherited from AbstractPokitServicePrivate
 AbstractPokitServicePrivate (const QBluetoothUuid &serviceUuid, QLowEnergyController *controller, AbstractPokitService *const q)
bool createServiceObject ()
 Creates an internal service object from the internal controller.
QLowEnergyCharacteristic getCharacteristic (const QBluetoothUuid &uuid) const
 Get uuid characteristic from the underlying service.
bool readCharacteristic (const QBluetoothUuid &uuid)
 Read the uuid characteristic.
bool enableCharacteristicNotificatons (const QBluetoothUuid &uuid)
 Enables client (Pokit device) side notification for characteristic uuid.
bool disableCharacteristicNotificatons (const QBluetoothUuid &uuid)
 Disables client (Pokit device) side notification for characteristic uuid.
Public Member Functions inherited from QObject
virtual const QMetaObjectmetaObject () const const
 QObject (QObject *parent)
virtual bool event (QEvent *e)
virtual bool eventFilter (QObject *watched, QEvent *event)
QString objectName () const const
void setObjectName (const QString &name)
bool isWidgetType () const const
bool isWindowType () const const
bool signalsBlocked () const const
bool blockSignals (bool block)
QThreadthread () const const
void moveToThread (QThread *targetThread)
int startTimer (int interval, Qt::TimerType timerType)
int startTimer (std::chrono::milliseconds time, Qt::TimerType timerType)
void killTimer (int id)
findChild (const QString &name, Qt::FindChildOptions options) const const
QList< T > findChildren (const QString &name, Qt::FindChildOptions options) const const
QList< T > findChildren (const QRegExp &regExp, Qt::FindChildOptions options) const const
QList< T > findChildren (const QRegularExpression &re, Qt::FindChildOptions options) const const
const QObjectListchildren () const const
void setParent (QObject *parent)
void installEventFilter (QObject *filterObj)
void removeEventFilter (QObject *obj)
QMetaObject::Connection connect (const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const const
bool disconnect (const char *signal, const QObject *receiver, const char *method) const const
bool disconnect (const QObject *receiver, const char *method) const const
void dumpObjectTree ()
void dumpObjectInfo ()
void dumpObjectTree () const const
void dumpObjectInfo () const const
bool setProperty (const char *name, const QVariant &value)
QVariant property (const char *name) const const
QList< QByteArraydynamicPropertyNames () const const
void destroyed (QObject *obj)
void objectNameChanged (const QString &objectName)
QObjectparent () const const
bool inherits (const char *className) const const
void deleteLater ()
 Q_DISABLE_COPY (Class)
 Q_DISABLE_MOVE (Class)
 Q_DISABLE_COPY_MOVE (Class)
qobject_cast (QObject *object)
qobject_cast (const QObject *object)
qFindChild (const QObject *obj, const QString &name)
QList< T > qFindChildren (const QObject *obj, const QString &name)
QList< T > qFindChildren (const QObject *obj, const QRegExp &regExp)
 Q_CLASSINFO (Name, Value)
 Q_INTERFACES (...)
 Q_PROPERTY (...)
 Q_ENUMS (...)
 Q_FLAGS (...)
 Q_ENUM (...)
 Q_FLAG (...)
 Q_ENUM_NS (...)
 Q_FLAG_NS (...)
 Q_OBJECT Q_OBJECT
 Q_GADGET Q_GADGET
 Q_NAMESPACE Q_NAMESPACE
 Q_NAMESPACE_EXPORT (EXPORT_MACRO)
 Q_SIGNALS Q_SIGNALS
 Q_SIGNAL Q_SIGNAL
 Q_SLOTS Q_SLOTS
 Q_SLOT Q_SLOT
 Q_EMIT Q_EMIT
 Q_INVOKABLE Q_INVOKABLE
 Q_REVISION Q_REVISION
 Q_SET_OBJECT_NAME (Object)
 QT_NO_NARROWING_CONVERSIONS_IN_CONNECT QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

Static Public Member Functions

static QByteArray encodeSettings (const DsoService::Settings &settings)
 Returns settings in the format Pokit devices expect.
static DsoService::Metadata parseMetadata (const QByteArray &value)
 Parses the Metadata value into a DsoService::Metatdata struct.
static DsoService::Samples parseSamples (const QByteArray &value)
 Parses the Reading value into a DsoService::Samples vector.
Static Public Member Functions inherited from AbstractPokitServicePrivate
static Q_LOGGING_CATEGORY (lc, "pokit.ble.service", QtInfoMsg)
 Logging category.
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 maxSize, otherwise returns true.
static QString toHexString (const QByteArray &data, const int maxSize=20)
 Returns up to maxSize bytes of data as a human readable hexadecimal string.
Static Public Member Functions inherited from QObject
QString tr (const char *sourceText, const char *disambiguation, int n)
QString trUtf8 (const char *sourceText, const char *disambiguation, int n)
QMetaObject::Connection connect (const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QMetaObject::Connection connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type)
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, Functor functor)
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *method)
bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
bool disconnect (const QMetaObject::Connection &connection)
bool disconnect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)

Protected Member Functions

void characteristicRead (const QLowEnergyCharacteristic &characteristic, const QByteArray &value) override
 Implements AbstractPokitServicePrivate::characteristicRead to parse value, then emit a specialised signal, for each supported characteristic.
void characteristicWritten (const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) override
 Implements AbstractPokitServicePrivate::characteristicWritten to parse newValue, then emit a specialised signal, for each supported characteristic.
void characteristicChanged (const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) override
 Implements AbstractPokitServicePrivate::characteristicChanged to parse newValue, then emit a specialised signal, for each supported characteristic.
Protected Member Functions inherited from QObject
QObjectsender () const const
int senderSignalIndex () const const
int receivers (const char *signal) const const
bool isSignalConnected (const QMetaMethod &signal) const const
virtual void timerEvent (QTimerEvent *event)
virtual void childEvent (QChildEvent *event)
virtual void customEvent (QEvent *event)
virtual void connectNotify (const QMetaMethod &signal)
virtual void disconnectNotify (const QMetaMethod &signal)

Additional Inherited Members

Public Attributes inherited from AbstractPokitServicePrivate
bool autoDiscover { true }
 Whether autodiscovery is enabled or not.
QLowEnergyControllercontroller { nullptr }
 BLE controller to fetch the service from.
std::optional< PokitProductpokitProduct
 The Pokit product controller is connected to.
QLowEnergyServiceservice { nullptr }
 BLE service to read/write characteristics.
QBluetoothUuid serviceUuid
 UUIDs for service.
Public Attributes inherited from QObject
typedef QObjectList
Protected Slots inherited from AbstractPokitServicePrivate
void connected ()
 Handles QLowEnergyController::connected events.
void discoveryFinished ()
 Handles QLowEnergyController::discoveryFinished events.
void errorOccurred (const QLowEnergyService::ServiceError newError)
 Handles QLowEnergyController::errorOccurred events.
virtual void serviceDiscovered (const QBluetoothUuid &newService)
 Handles QLowEnergyController::serviceDiscovered events.
void stateChanged (QLowEnergyService::ServiceState newState)
 Handles QLowEnergyController::stateChanged events.
Protected Attributes inherited from AbstractPokitServicePrivate
AbstractPokitServiceq_ptr
 Internal q-pointer.
Properties inherited from QObject
 objectName

Detailed Description

The DsoServicePrivate class provides private implementation for DsoService.

Definition at line 18 of file dsoservice_p.h.

Constructor & Destructor Documentation

◆ DsoServicePrivate()

DsoServicePrivate::DsoServicePrivate ( QLowEnergyController * controller,
DsoService *const q )
explicit

Constructs a new DsoServicePrivate object with public implementation q.

Definition at line 331 of file dsoservice.cpp.

334{
335
336}
AbstractPokitServicePrivate(const QBluetoothUuid &serviceUuid, QLowEnergyController *controller, AbstractPokitService *const q)
QLowEnergyController * controller
BLE controller to fetch the service from.
static const QBluetoothUuid serviceUuid
UUID of the "DSO" service.
Definition dsoservice.h:29

References AbstractPokitServicePrivate::AbstractPokitServicePrivate(), AbstractPokitServicePrivate::controller, and AbstractPokitServicePrivate::serviceUuid.

Here is the call graph for this function:

Member Function Documentation

◆ characteristicChanged()

void DsoServicePrivate::characteristicChanged ( const QLowEnergyCharacteristic & characteristic,
const QByteArray & newValue )
overrideprotectedvirtual

Implements AbstractPokitServicePrivate::characteristicChanged to parse newValue, then emit a specialised signal, for each supported characteristic.

Reimplemented from AbstractPokitServicePrivate.

Definition at line 469 of file dsoservice.cpp.

471{
473
474 Q_Q(DsoService);
475 if (characteristic.uuid() == DsoService::CharacteristicUuids::settings) {
476 qCWarning(lc).noquote() << tr("Settings characteristic is write-only, but somehow updated")
477 << serviceUuid << characteristic.name() << characteristic.uuid();
478 return;
479 }
480
481 if (characteristic.uuid() == DsoService::CharacteristicUuids::metadata) {
482 Q_EMIT q->metadataRead(parseMetadata(newValue));
483 return;
484 }
485
486 if (characteristic.uuid() == DsoService::CharacteristicUuids::reading) {
487 Q_EMIT q->samplesRead(parseSamples(newValue));
488 return;
489 }
490
491 qCWarning(lc).noquote() << tr("Unknown characteristic notified for DSO service")
492 << serviceUuid << characteristic.name() << characteristic.uuid();
493}
QBluetoothUuid serviceUuid
UUIDs for service.
virtual void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Handles QLowEnergyService::characteristicChanged events.
static DsoService::Samples parseSamples(const QByteArray &value)
Parses the Reading value into a DsoService::Samples vector.
static DsoService::Metadata parseMetadata(const QByteArray &value)
Parses the Metadata value into a DsoService::Metatdata struct.
QString name() const const
QBluetoothUuid uuid() const const
Q_EMITQ_EMIT
QString tr(const char *sourceText, const char *disambiguation, int n)
static const QBluetoothUuid metadata
UUID of the DSO service's Metadata characteristic.
Definition dsoservice.h:37
static const QBluetoothUuid reading
UUID of the DSO service's Reading characteristic.
Definition dsoservice.h:40
static const QBluetoothUuid settings
UUID of the DSO service's Settings characteristic.
Definition dsoservice.h:34

References AbstractPokitServicePrivate::characteristicChanged(), DsoService::CharacteristicUuids::metadata, QLowEnergyCharacteristic::name(), parseMetadata(), parseSamples(), QObject::Q_EMIT(), DsoService::CharacteristicUuids::reading, AbstractPokitServicePrivate::serviceUuid, DsoService::CharacteristicUuids::settings, QObject::tr(), and QLowEnergyCharacteristic::uuid().

Here is the call graph for this function:

◆ characteristicRead()

void DsoServicePrivate::characteristicRead ( const QLowEnergyCharacteristic & characteristic,
const QByteArray & value )
overrideprotectedvirtual

Implements AbstractPokitServicePrivate::characteristicRead to parse value, then emit a specialised signal, for each supported characteristic.

Reimplemented from AbstractPokitServicePrivate.

Definition at line 407 of file dsoservice.cpp.

409{
411
412 if (characteristic.uuid() == DsoService::CharacteristicUuids::settings) {
413 qCWarning(lc).noquote() << tr("Settings characteristic is write-only, but somehow read")
414 << serviceUuid << characteristic.name() << characteristic.uuid();
415 return;
416 }
417
418 Q_Q(DsoService);
419 if (characteristic.uuid() == DsoService::CharacteristicUuids::metadata) {
420 Q_EMIT q->metadataRead(parseMetadata(value));
421 return;
422 }
423
424 if (characteristic.uuid() == DsoService::CharacteristicUuids::reading) {
425 qCWarning(lc).noquote() << tr("Reading characteristic is notify-only")
426 << serviceUuid << characteristic.name() << characteristic.uuid();
427 return;
428 }
429
430 qCWarning(lc).noquote() << tr("Unknown characteristic read for DSO service")
431 << serviceUuid << characteristic.name() << characteristic.uuid();
432}
virtual void characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
Handles QLowEnergyService::characteristicRead events.

References AbstractPokitServicePrivate::characteristicRead(), DsoService::CharacteristicUuids::metadata, QLowEnergyCharacteristic::name(), parseMetadata(), QObject::Q_EMIT(), DsoService::CharacteristicUuids::reading, AbstractPokitServicePrivate::serviceUuid, DsoService::CharacteristicUuids::settings, QObject::tr(), and QLowEnergyCharacteristic::uuid().

Here is the call graph for this function:

◆ characteristicWritten()

void DsoServicePrivate::characteristicWritten ( const QLowEnergyCharacteristic & characteristic,
const QByteArray & newValue )
overrideprotectedvirtual

Implements AbstractPokitServicePrivate::characteristicWritten to parse newValue, then emit a specialised signal, for each supported characteristic.

Reimplemented from AbstractPokitServicePrivate.

Definition at line 438 of file dsoservice.cpp.

440{
442
443 Q_Q(DsoService);
444 if (characteristic.uuid() == DsoService::CharacteristicUuids::settings) {
445 Q_EMIT q->settingsWritten();
446 return;
447 }
448
449 if (characteristic.uuid() == DsoService::CharacteristicUuids::metadata) {
450 qCWarning(lc).noquote() << tr("Metadata characteristic is read/notify, but somehow written")
451 << serviceUuid << characteristic.name() << characteristic.uuid();
452 return;
453 }
454
455 if (characteristic.uuid() == DsoService::CharacteristicUuids::reading) {
456 qCWarning(lc).noquote() << tr("Reading characteristic is notify-only, but somehow written")
457 << serviceUuid << characteristic.name() << characteristic.uuid();
458 return;
459 }
460
461 qCWarning(lc).noquote() << tr("Unknown characteristic written for DSO service")
462 << serviceUuid << characteristic.name() << characteristic.uuid();
463}
virtual void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Handles QLowEnergyService::characteristicWritten events.

References AbstractPokitServicePrivate::characteristicWritten(), DsoService::CharacteristicUuids::metadata, QLowEnergyCharacteristic::name(), QObject::Q_EMIT(), DsoService::CharacteristicUuids::reading, AbstractPokitServicePrivate::serviceUuid, DsoService::CharacteristicUuids::settings, QObject::tr(), and QLowEnergyCharacteristic::uuid().

Here is the call graph for this function:

◆ encodeSettings()

QByteArray DsoServicePrivate::encodeSettings ( const DsoService::Settings & settings)
static

Returns settings in the format Pokit devices expect.

Definition at line 341 of file dsoservice.cpp.

342{
343 static_assert(sizeof(settings.command) == 1, "Expected to be 1 byte.");
344 static_assert(sizeof(settings.triggerLevel) == 4, "Expected to be 2 bytes.");
345 static_assert(sizeof(settings.mode) == 1, "Expected to be 1 byte.");
346 static_assert(sizeof(settings.range) == 1, "Expected to be 1 byte.");
347 static_assert(sizeof(settings.samplingWindow) == 4, "Expected to be 4 bytes.");
348 static_assert(sizeof(settings.numberOfSamples) == 2, "Expected to be 2 bytes.");
349
350 QByteArray value;
351 QDataStream stream(&value, QIODevice::WriteOnly);
352 stream.setByteOrder(QDataStream::LittleEndian);
353 stream.setFloatingPointPrecision(QDataStream::SinglePrecision); // 32-bit floats, not 64-bit.
354 stream << (quint8)settings.command << settings.triggerLevel << (quint8)settings.mode
355 << settings.range << settings.samplingWindow << settings.numberOfSamples;
356
357 Q_ASSERT(value.size() == 13);
358 return value;
359}
int size() const const
Mode mode
Desired operation mode.
Definition dsoservice.h:71
quint8 range
Desired range, eg settings.range = +PokitPro::CurrentRange::AutoRange;.
Definition dsoservice.h:72
Command command
Custom operation request.
Definition dsoservice.h:69
quint32 samplingWindow
Desired sampling window in microseconds.
Definition dsoservice.h:73
float triggerLevel
Trigger threshold level in Volts or Amps, depending on mode.
Definition dsoservice.h:70
quint16 numberOfSamples
Desired number of samples to acquire.
Definition dsoservice.h:74

References DsoService::Settings::command, QDataStream::LittleEndian, DsoService::Settings::mode, DsoService::Settings::numberOfSamples, DsoService::Settings::range, DsoService::Settings::samplingWindow, QDataStream::setByteOrder(), QDataStream::setFloatingPointPrecision(), QDataStream::SinglePrecision, QByteArray::size(), DsoService::Settings::triggerLevel, and QIODevice::WriteOnly.

Referenced by DsoService::setSettings().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parseMetadata()

DsoService::Metadata DsoServicePrivate::parseMetadata ( const QByteArray & value)
static

Parses the Metadata value into a DsoService::Metatdata struct.

Definition at line 364 of file dsoservice.cpp.

365{
366 DsoService::Metadata metadata{
367 DsoService::DsoStatus::Error, std::numeric_limits<float>::quiet_NaN(),
368 DsoService::Mode::Idle, 0, 0, 0, 0
369 };
370
371 if (!checkSize(u"Metadata"_s, value, 17, 17)) {
372 return metadata;
373 }
374
375 metadata.status = static_cast<DsoService::DsoStatus>(value.at(0));
376 metadata.scale = qFromLittleEndian<float>(value.mid(1,4).constData());
377 metadata.mode = static_cast<DsoService::Mode>(value.at(5));
378 metadata.range = static_cast<quint8>(value.at(6));
379 metadata.samplingWindow = qFromLittleEndian<quint32>(value.mid(7,4).constData());
380 metadata.numberOfSamples = qFromLittleEndian<quint16>(value.mid(11,2).constData());
381 metadata.samplingRate = qFromLittleEndian<quint32>(value.mid(13,4).constData());
382 return metadata;
383}
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...
DsoStatus
Values supported by the Status attribute of the Metadata characteristic.
Definition dsoservice.h:78
@ Error
An error has occurred.
Definition dsoservice.h:81
Mode
Values supported by the Mode attribute of the Settings and Metadata characteristics.
Definition dsoservice.h:53
@ Idle
Make device idle.
Definition dsoservice.h:54
char at(int i) const const
const char * constData() const const
QByteArray mid(int pos, int len) const const
quint32 samplingRate
Sampling rate used during last acquisition (1 to 1MHz).
Definition dsoservice.h:92
DsoStatus status
Current DSO status.
Definition dsoservice.h:86
float scale
Scale to apply to read samples.
Definition dsoservice.h:87
quint16 numberOfSamples
Number of samples acquired (1 to 8,192|16,384 for Pokit Meter|Pro).
Definition dsoservice.h:91
quint8 range
Range used during last acquisition.
Definition dsoservice.h:89
Mode mode
Operation mode used during last acquisition.
Definition dsoservice.h:88
quint32 samplingWindow
Sampling window (microseconds) used during last acquisition.
Definition dsoservice.h:90

References QByteArray::at(), AbstractPokitServicePrivate::checkSize(), QByteArray::constData(), DsoService::Error, DsoService::Idle, QByteArray::mid(), DsoService::Metadata::mode, DsoService::Metadata::numberOfSamples, DsoService::Metadata::range, DsoService::Metadata::samplingRate, DsoService::Metadata::samplingWindow, DsoService::Metadata::scale, and DsoService::Metadata::status.

Referenced by characteristicChanged(), characteristicRead(), and DsoService::metadata().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parseSamples()

DsoService::Samples DsoServicePrivate::parseSamples ( const QByteArray & value)
static

Parses the Reading value into a DsoService::Samples vector.

Definition at line 388 of file dsoservice.cpp.

389{
390 DsoService::Samples samples;
391 if ((value.size()%2) != 0) {
392 qCWarning(lc).noquote() << tr("Samples value has odd size %1 (should be even): %2")
393 .arg(value.size()).arg(toHexString(value));
394 return samples;
395 }
396 while ((samples.size()*2) < value.size()) {
397 samples.append(qFromLittleEndian<qint16>(value.mid(samples.size()*2,2).constData()));
398 }
399 qCDebug(lc).noquote() << tr("Read %n sample/s from %1-bytes.", nullptr, samples.size()).arg(value.size());
400 return samples;
401}
static QString toHexString(const QByteArray &data, const int maxSize=20)
Returns up to maxSize bytes of data as a human readable hexadecimal string.
QVector< qint16 > Samples
Raw samples from the Reading characteristic.
Definition dsoservice.h:95
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
void append(const T &value)
int size() const const

References QVector::append(), QString::arg(), QByteArray::constData(), QByteArray::mid(), QByteArray::size(), QVector::size(), AbstractPokitServicePrivate::toHexString(), and QObject::tr().

Referenced by characteristicChanged().

Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following files: