Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.2 KiB

  1. // -----------------------------------------------------------------------------
  2. // Abstract sensor class (other sensor classes extend this class)
  3. // Copyright (C) 2017 by Xose Pérez <xose dot perez at gmail dot com>
  4. // -----------------------------------------------------------------------------
  5. #pragma once
  6. #include <Arduino.h>
  7. #include <ArduinoJson.h>
  8. typedef enum magnitude_t {
  9. MAGNITUDE_NONE = 0,
  10. MAGNITUDE_TEMPERATURE,
  11. MAGNITUDE_HUMIDITY,
  12. MAGNITUDE_PRESSURE,
  13. MAGNITUDE_CURRENT,
  14. MAGNITUDE_VOLTAGE,
  15. MAGNITUDE_POWER_ACTIVE,
  16. MAGNITUDE_POWER_APPARENT,
  17. MAGNITUDE_POWER_REACTIVE,
  18. MAGNITUDE_ENERGY,
  19. MAGNITUDE_ENERGY_DELTA,
  20. MAGNITUDE_POWER_FACTOR,
  21. MAGNITUDE_ANALOG,
  22. MAGNITUDE_DIGITAL,
  23. MAGNITUDE_EVENTS,
  24. MAGNITUDE_PM1dot0,
  25. MAGNITUDE_PM2dot5,
  26. MAGNITUDE_PM10,
  27. MAGNITUDE_CO2,
  28. MAGNITUDE_MAX,
  29. } magnitude_t;
  30. #define GPIO_NONE 0x99
  31. #define SENSOR_ERROR_OK 0 // No error
  32. #define SENSOR_ERROR_OUT_OF_RANGE 1 // Result out of sensor range
  33. #define SENSOR_ERROR_WARM_UP 2 // Sensor is warming-up
  34. #define SENSOR_ERROR_TIMEOUT 3 // Response from sensor timed out
  35. #define SENSOR_ERROR_UNKNOWN_ID 4 // Sensor did not report a known ID
  36. #define SENSOR_ERROR_CRC 5 // Sensor data corrupted
  37. #define SENSOR_ERROR_I2C 6 // Wrong or locked I2C address
  38. class BaseSensor {
  39. public:
  40. // Constructor
  41. BaseSensor() {}
  42. // Destructor
  43. ~BaseSensor() {}
  44. // Initialization method, must be idempotent
  45. virtual void begin() {}
  46. // Loop-like method, call it in your main loop
  47. virtual void tick() {}
  48. // Pre-read hook (usually to populate registers with up-to-date data)
  49. virtual void pre() {}
  50. // Post-read hook (usually to reset things)
  51. virtual void post() {}
  52. // Descriptive name of the sensor
  53. virtual String description() {}
  54. // Type for slot # index
  55. virtual magnitude_t type(unsigned char index) {}
  56. // Current value for slot # index
  57. virtual double value(unsigned char index) {}
  58. // Retrieve current instance configuration
  59. virtual void getConfig(JsonObject& root) {};
  60. // Save current instance configuration
  61. virtual void setConfig(JsonObject& root) {};
  62. // Load the configuration manifest
  63. static void manifest(JsonArray& root) {};
  64. // Descriptive name of the slot # index
  65. String slot(unsigned char index) { return description(); }
  66. // Sensor ID
  67. unsigned char getID() { return _sensor_id; };
  68. // Specific for I2C sensors
  69. unsigned char lock_i2c(unsigned char address, size_t size, unsigned char * addresses) {
  70. // Check if we should release a previously locked address
  71. if (_previous_address != address) {
  72. i2cReleaseLock(_previous_address);
  73. }
  74. // If we have already an address, check it is not locked
  75. if (address && !i2cGetLock(address)) {
  76. _error = SENSOR_ERROR_I2C;
  77. // If we don't have an address...
  78. } else {
  79. // Trigger auto-discover
  80. address = i2cFindAndLock(size, addresses);
  81. // If still nothing exit with error
  82. if (address == 0) _error = SENSOR_ERROR_I2C;
  83. }
  84. _previous_address = address;
  85. return address;
  86. }
  87. // Return sensor status (true for ready)
  88. bool status() { return _error == 0; }
  89. // Return sensor last internal error
  90. int error() { return _error; }
  91. // Number of available slots
  92. unsigned char count() { return _count; }
  93. protected:
  94. // Check if valid GPIO
  95. bool _validGPIO(unsigned char gpio) {
  96. if (0 <= gpio && gpio <= 5) return true;
  97. if (12 <= gpio && gpio <= 15) return true;
  98. return false;
  99. }
  100. unsigned char _sensor_id = 0x00;
  101. int _error = 0;
  102. bool _dirty = true;
  103. unsigned char _count = 0;
  104. // I2C
  105. unsigned char _previous_address = 0;
  106. unsigned char _address = 0;
  107. };