Revision control

++ // Copyright (C) 2025 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #ifndef OHOSSENSORBACKENDBASE_H
++ #define OHOSSENSORBACKENDBASE_H
++
++ #include <QSensorBackend>
++ #include <QtCore/private/qohoslogger_p.h>
++ #include <limits>
++ #include <ohossensorsmanager.h>
++
++ template<typename T>
++ class OhosSensorBackendBase : public QSensorBackend
++ {
++ public:
++ OhosSensorBackendBase(QSensor *sensor, bool absoluteValueSensor = false);
++ virtual ~OhosSensorBackendBase();
++
++ void start() final;
++ void stop() final;
++
++ protected:
++ virtual void processSensorData(const OhosSensorData &sensorData) = 0;
++ T m_reading;
++ };
++
++ template<typename T>
++ OhosSensorBackendBase<T>::OhosSensorBackendBase(QSensor *sensor, bool absoluteValueSensor)
++ : QSensorBackend(sensor)
++ {
++ setReading<T>(&m_reading);
++ auto capabilities = OhosSensorsManager::instance()->tryGetSensorCapabilities(sensor);
++ if (capabilities.has_value()) {
++ auto capabilitiesData = capabilities.value();
++
++ addOutputRange(
++ absoluteValueSensor
++ ? 0.0
++ : std::numeric_limits<qreal>::lowest(),
++ std::numeric_limits<qreal>::max(),
++ capabilitiesData.resolution);
++
++ addDataRate(capabilitiesData.minDataRate, capabilitiesData.maxDataRate);
++ } else {
++ qOhosPrintfError("%s: Cannot obtain sensor capabilities.", Q_FUNC_INFO);
++ }
++ }
++
++ template<typename T>
++ OhosSensorBackendBase<T>::~OhosSensorBackendBase()
++ {
++ stop();
++ }
++
++ template<typename T>
++ void OhosSensorBackendBase<T>::start()
++ {
++ if (sensor()->dataRate() == 0) {
++ constexpr int defaultDataRate = 5;
++ auto availableDataRates = sensor()->availableDataRates();
++ sensor()->setDataRate(
++ !availableDataRates.isEmpty() && availableDataRates.first().first != 0
++ ? availableDataRates.first().first
++ : defaultDataRate);
++ }
++
++ OhosSensorsManager::instance()->subscribeSensor(
++ sensor(),
++ [this](const OhosSensorData &data) {
++ processSensorData(data);
++ });
++ }
++
++ template<typename T>
++ void OhosSensorBackendBase<T>::stop()
++ {
++ OhosSensorsManager::instance()->unsubscribeSensor(sensor());
++ }
++
++ #endif