Line data Source code
1 : // SPDX-FileCopyrightText: 2022-2024 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 3762 : 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 1980 : ~MultimeterService() = default;
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 : Q_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 342 : 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
|