Skip to content
Snippets Groups Projects
measured.h 2.09 KiB
Newer Older
fxk8y's avatar
fxk8y committed
#pragma once

#include <string>
fxk8y's avatar
fxk8y committed
#include <vector>
fxk8y's avatar
fxk8y committed
#include <functional>
#include "device/device_config.h"

#ifndef MEASURED_PERIOD_MS
#define MEASURED_PERIOD_MS 1000
#endif


fxk8y's avatar
fxk8y committed
namespace qthing {

    namespace measured {

fxk8y's avatar
fxk8y committed
        class MeasureResult {
            
            public:
                const float value;

                const std::string& sensor_name;
                const std::string& sensor_type;
                const std::string& sensor_unit;

fxk8y's avatar
fxk8y committed
                MeasureResult(const std::string& name, const std::string& type, const std::string& unit, float value);

fxk8y's avatar
fxk8y committed
        };
fxk8y's avatar
fxk8y committed
        class Sensor {

            enum skip_measurement_t { no_skip, skip };

            public:
                const std::string& name;
                const std::string& type;
                const std::string& unit;

                Sensor(const std::string& name, const std::string& type, const std::string& unit);

                virtual skip_measurement_t prepare_next_measurement();
                virtual MeasureResult measure() = 0;

            protected:
                MeasureResult create_result(float value);
        };

        // typedef std::function<float()> sensor_t;
fxk8y's avatar
fxk8y committed
        typedef std::function<void(const std::vector<MeasureResult>&)> backend_t;
fxk8y's avatar
fxk8y committed
        void register_backend(backend_t new_backend);
fxk8y's avatar
fxk8y committed
        void register_sensor(std::string name, std::string type, std::string unit, Sensor *sensor);
fxk8y's avatar
fxk8y committed
        void set_measure_period(uint16_t period);
fxk8y's avatar
fxk8y committed

fxk8y's avatar
fxk8y committed
        class Measured {

            public:
                Measured();
fxk8y's avatar
fxk8y committed
                void register_backend(backend_t new_backend);
fxk8y's avatar
fxk8y committed
                void register_sensor(std::string name, std::string type, std::string unit, Sensor *sensor);
fxk8y's avatar
fxk8y committed
                void set_measure_period(uint16_t period);
fxk8y's avatar
fxk8y committed

            private:
fxk8y's avatar
fxk8y committed
                std::vector<Sensor *> sensors;
fxk8y's avatar
fxk8y committed
                qthing::measured::backend_t backend;
                uint16_t measure_period = MEASURED_PERIOD_MS;
                void measured();
        };

fxk8y's avatar
fxk8y committed
        namespace backend {
fxk8y's avatar
fxk8y committed
            void mqtt(const std::vector<qthing::measured::MeasureResult>& data);
fxk8y's avatar
fxk8y committed
        }