// ----------------------------------------------------------------------------- // Abstract sensor class (other sensor classes extend this class) // Copyright (C) 2017-2019 by Xose PĂ©rez // ----------------------------------------------------------------------------- #pragma once #include #include #include #include class BaseSensor { public: // Must implement as virtual. // Allows inhereting class correctly call it's own destructor through the ~BaseSensor() virtual ~BaseSensor() { } // Initialization method, must be idempotent virtual void begin() { } // Loop-like method, call it in your main loop virtual void tick() { } // Pre-read hook (usually to populate registers with up-to-date data) virtual void pre() { } // Post-read hook (usually to reset things) virtual void post() { } // Type of sensor virtual unsigned char type() { return sensor::type::Base; } // Number of decimals for a unit (or -1 for default) virtual signed char decimals(sensor::Unit) { return -1; } // Generic calibration virtual void calibrate() { }; // Sensor ID virtual unsigned char getID() { return _sensor_id; }; // Return status (true if no errors) bool status() { return 0 == _error; } // Return ready status (true for ready) bool ready() { return _ready; } // Return sensor last internal error int error() { return _error; } // Number of available slots unsigned char count() { return _count; } // Convert slot # index to a magnitude # index virtual unsigned char local(unsigned char slot) { return 0; } // Specify units attached to magnitudes virtual sensor::Unit units(unsigned char index) { switch (type(index)) { case MAGNITUDE_TEMPERATURE: return sensor::Unit::Celcius; case MAGNITUDE_HUMIDITY: case MAGNITUDE_POWER_FACTOR: return sensor::Unit::Percentage; case MAGNITUDE_PRESSURE: return sensor::Unit::Hectopascal; case MAGNITUDE_CURRENT: return sensor::Unit::Ampere; case MAGNITUDE_VOLTAGE: return sensor::Unit::Volt; case MAGNITUDE_POWER_ACTIVE: return sensor::Unit::Watt; case MAGNITUDE_POWER_APPARENT: return sensor::Unit::Voltampere; case MAGNITUDE_POWER_REACTIVE: return sensor::Unit::VoltampereReactive; case MAGNITUDE_ENERGY_DELTA: return sensor::Unit::Joule; case MAGNITUDE_ENERGY: return sensor::Unit::KilowattHour; case MAGNITUDE_PM1dot0: case MAGNITUDE_PM2dot5: return sensor::Unit::MicrogrammPerCubicMeter; case MAGNITUDE_CO: case MAGNITUDE_CO2: case MAGNITUDE_NO2: case MAGNITUDE_VOC: return sensor::Unit::PartsPerMillion; case MAGNITUDE_LUX: return sensor::Unit::Lux; case MAGNITUDE_RESISTANCE: return sensor::Unit::Ohm; case MAGNITUDE_HCHO: return sensor::Unit::MilligrammPerCubicMeter; case MAGNITUDE_GEIGER_CPM: return sensor::Unit::CountsPerMinute; case MAGNITUDE_GEIGER_SIEVERT: return sensor::Unit::MicrosievertPerHour; case MAGNITUDE_DISTANCE: return sensor::Unit::Meter; case MAGNITUDE_FREQUENCY: return sensor::Unit::Hertz; case MAGNITUDE_PH: return sensor::Unit::Ph; default: break; } return sensor::Unit::None; } // Descriptive name of the sensor virtual String description() = 0; // Descriptive name of the slot # index virtual String description(unsigned char index) = 0; // Address of the sensor (it could be the GPIO or I2C address) virtual String address(unsigned char index) = 0; // Type for slot # index virtual unsigned char type(unsigned char index) = 0; // Current value for slot # index virtual double value(unsigned char index) = 0; protected: unsigned char _sensor_id = 0; int _error = 0; bool _dirty = true; unsigned char _count = 0; bool _ready = false; };