Line data Source code
1 : // SPDX-FileCopyrightText: 2022-2023 Paul Colby <git@colby.id.au> 2 : // SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : /*! 5 : * \file 6 : * Declares the MultimeterService class. 7 : */ 8 : 9 : #ifndef QTPOKIT_MULTIMETERSERVICE_H 10 : #define QTPOKIT_MULTIMETERSERVICE_H 11 : 12 : #include "abstractpokitservice.h" 13 : 14 : #include <QBluetoothAddress> 15 : #include <QBluetoothUuid> 16 : #include <QVersionNumber> 17 : 18 : QTPOKIT_BEGIN_NAMESPACE 19 : 20 : class MultimeterServicePrivate; 21 : 22 : class QTPOKIT_EXPORT MultimeterService : public AbstractPokitService 23 : { 24 1881 : Q_OBJECT 25 : 26 : public: 27 : /// UUID of the `Multimeter` service. 28 : static inline const QBluetoothUuid serviceUuid { QStringLiteral("e7481d2f-5781-442e-bb9a-fd4e3441dadc") }; 29 : 30 : /// Characteristics available via the `Multimeter` service. 31 : struct QTPOKIT_EXPORT CharacteristicUuids { 32 : /// UUID of the `Multimeter` service's `Settings` characterstic. 33 : static inline const QBluetoothUuid settings { QStringLiteral("53dc9a7a-bc19-4280-b76b-002d0e23b078") }; 34 : 35 : /// UUID of the `Multimeter` service's `Reading` characterstic. 36 : static inline const QBluetoothUuid reading { QStringLiteral("047d3559-8bee-423a-b229-4417fa603b90") }; 37 : }; 38 : 39 : /// Values supported by the `Mode` attribute of the `Settings` and `Reading` characteristics. 40 : enum class Mode : quint8 { 41 : Idle = 0, ///< Make device idle. 42 : DcVoltage = 1, ///< Measure DC voltage. 43 : AcVoltage = 2, ///< Measure AC voltage. 44 : DcCurrent = 3, ///< Measure DC current. 45 : AcCurrent = 4, ///< Measure AC current. 46 : Resistance = 5, ///< Measure resistance. 47 : Diode = 6, ///< Measure diode. 48 : Continuity = 7, ///< Measure continuity. 49 : Temperature = 8, ///< Measure temperature. 50 : Capacitance = 9, ///< Measure capacitance. 51 : ExternalTemperature = 10, ///< Measure temperature via an external temperature probe. 52 : }; 53 : static QString toString(const Mode &mode); 54 : 55 : static QString toString(const PokitProduct product, const quint8 range, const Mode mode); 56 : QString toString(const quint8 range, const Mode mode) const; 57 : static QVariant maxValue(const PokitProduct product, const quint8 range, const Mode mode); 58 : QVariant maxValue(const quint8 range, const Mode mode) const; 59 : 60 : /// Attributes included in the `Settings` characterstic. 61 : struct Settings { 62 : Mode mode; ///< Desired operation mode. 63 : quint8 range; ///< Desired range. 64 : quint32 updateInterval; ///< Desired update interval in milliseconds. 65 : }; 66 : 67 : /// Values supported by the `Status` attribute of the `Settings` characteristic. 68 : enum class MeterStatus : quint8 { 69 : AutoRangeOff = 0, ///< Auto-range is disabled (voltage, current and resistance modes only). 70 : AutoRangeOn = 1, ///< Auto-range is enabled (voltage, current and resistance modes only). 71 : NoContinuity = 0, ///< No continuity (continuity mode only). 72 : Continuity = 1, ///< Continuity (continuity mode only). 73 : Ok = 0, ///< Ok (temperature and diode modes only). 74 : Error = 255 ///< Error (all modes). 75 : }; 76 : 77 : /// Attributes included in the `Reading` characterstic. 78 : struct Reading { 79 : MeterStatus status; ///< Current multimeter status. 80 : float value; ///< Last acquired value. 81 : Mode mode; ///< Current operation mode. 82 : quint8 range; ///< Current range. 83 : }; 84 : 85 : MultimeterService(QLowEnergyController * const pokitDevice, QObject * parent = nullptr); 86 : ~MultimeterService() override; 87 : 88 : bool readCharacteristics() override; 89 : bool readReadingCharacteristic(); 90 : 91 : // Settings characteristic (BLE write only). 92 : bool setSettings(const Settings &settings); 93 : 94 : // Reading characteristic (BLE read/notify). 95 : Reading reading() const; 96 : bool enableReadingNotifications(); 97 : bool disableReadingNotifications(); 98 : 99 : signals: 100 : void settingsWritten(); 101 : void readingRead(const MultimeterService::Reading &reading); 102 : 103 : protected: 104 : /// \cond internal 105 : MultimeterService(MultimeterServicePrivate * const d, QObject * const parent); 106 : /// \endcond 107 : 108 : private: 109 171 : Q_DECLARE_PRIVATE(MultimeterService) 110 : Q_DISABLE_COPY(MultimeterService) 111 : friend class TestMultimeterService; 112 : }; 113 : 114 : QTPOKIT_END_NAMESPACE 115 : 116 : #endif // QTPOKIT_MULTIMETERSERVICE_H