|
|
- // -----------------------------------------------------------------------------
- // Abstract sensor class (other sensor classes extend this class)
- // Copyright (C) 2017-2018 by Xose Pérez <xose dot perez at gmail dot com>
- // -----------------------------------------------------------------------------
-
- #if SENSOR_SUPPORT
-
- #pragma once
-
- #include <Arduino.h>
- #include <ArduinoJson.h>
-
- #define SENSOR_ERROR_OK 0 // No error
- #define SENSOR_ERROR_OUT_OF_RANGE 1 // Result out of sensor range
- #define SENSOR_ERROR_WARM_UP 2 // Sensor is warming-up
- #define SENSOR_ERROR_TIMEOUT 3 // Response from sensor timed out
- #define SENSOR_ERROR_UNKNOWN_ID 4 // Sensor did not report a known ID
- #define SENSOR_ERROR_CRC 5 // Sensor data corrupted
- #define SENSOR_ERROR_I2C 6 // Wrong or locked I2C address
- #define SENSOR_ERROR_GPIO_USED 7 // The GPIO is already in use
- #define SENSOR_ERROR_CALIBRATION 8 // Calibration error or Not calibrated
- #define SENSOR_ERROR_OTHER 99 // Any other error
-
- typedef std::function<void(unsigned char, const char *)> TSensorCallback;
-
- class BaseSensor {
-
- public:
-
- // Constructor
- BaseSensor() {}
-
- // Destructor
- ~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() {}
-
- // Descriptive name of the sensor
- virtual String description() = 0;
-
- // Address of the sensor (it could be the GPIO or I2C address)
- virtual String address(unsigned char index) = 0;
-
- // Descriptive name of the slot # index
- virtual String slot(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;
-
- // Retrieve current instance configuration
- virtual void getConfig(JsonObject& root) {};
-
- // Save current instance configuration
- virtual void setConfig(JsonObject& root) {};
-
- // Load the configuration manifest
- static void manifest(JsonArray& root) {};
-
- // Sensor ID
- 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; }
-
- // Hook for event callback
- void onEvent(TSensorCallback fn) { _callback = fn; };
-
- protected:
-
- TSensorCallback _callback = NULL;
- unsigned char _sensor_id = 0x00;
- int _error = 0;
- bool _dirty = true;
- unsigned char _count = 0;
- bool _ready = false;
-
- };
-
- #endif
|