Sensors.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #ifndef UNITEMP_SENSORS
  2. #define UNITEMP_SENSORS
  3. #include <furi.h>
  4. #include <input/input.h>
  5. //Статусы опроса датчика
  6. typedef enum {
  7. UT_OK, //Всё хорошо, опрос успешен
  8. UT_TIMEOUT, //Датчик не отозвался
  9. UT_EARLYPOOL, //Опрос раньше положенной задержки
  10. UT_BADCRC, //Неверная контрольная сумма
  11. UT_ERROR, //Прочие ошибки
  12. } UnitempStatus;
  13. //Типы датчиков
  14. typedef enum {
  15. DHT11,
  16. DHT12_1W,
  17. DHT12_I2C,
  18. DHT20, //AM2108
  19. DHT21, //AM2301
  20. DHT22, //AM2302
  21. AM2320_1W,
  22. AM2320_I2C,
  23. LM75,
  24. DS18B20,
  25. BMP180,
  26. BMP280,
  27. BME280,
  28. //Порядок сенсоров сверху не менять!
  29. SENSOR_TYPES_COUNT //Общее количество типов датчиков
  30. } SensorType;
  31. //Типы подключения датчиков
  32. typedef enum Interface {
  33. SINGLE_WIRE, //Собственный однопроводной протокол датчиков DHTXX и AM23XX
  34. ONE_WIRE, //Однопроводной протокол Dallas
  35. I2C,
  36. SPI,
  37. CONNECTION_TYPES_COUNT //Общее количество типов подключений
  38. } Interface;
  39. //Порт ввода/вывода Flipper Zero
  40. typedef struct GPIO {
  41. const uint8_t num;
  42. const char* name;
  43. const GpioPin* pin;
  44. } GPIO;
  45. struct Sensor;
  46. /**
  47. * @brief Указатель функции выделения памяти и подготовки экземпляра датчика
  48. */
  49. typedef void(SensorAllocator)(void* sensor, SensorType st);
  50. /**
  51. * @brief Указатель на функцию высвобождении памяти датчика
  52. */
  53. typedef void(SensorFree)(void* sensor);
  54. /**
  55. * @brief Указатель функции инициализации датчика
  56. */
  57. typedef bool(SensorInitializer)(void* sensor);
  58. /**
  59. * @brief Указатель функции деинициализации датчика
  60. */
  61. typedef bool(SensorDeinitializer)(void* sensor);
  62. /**
  63. * @brief Указатель функции обновления значения датчика
  64. */
  65. typedef UnitempStatus(SensorUpdater)(void* sensor);
  66. //Датчик
  67. typedef struct Sensor {
  68. //Имя датчика
  69. char* name;
  70. //Температура
  71. float temp;
  72. //Относительная влажность
  73. float hum;
  74. //Тип датчика
  75. SensorType type;
  76. //Интерфейсы подключения
  77. Interface interface;
  78. //Статус последнего опроса датчика
  79. UnitempStatus status;
  80. //Экземпляр датчика
  81. void* instance;
  82. SensorAllocator* allocator;
  83. SensorFree* memoryfree;
  84. SensorInitializer* initializer;
  85. SensorDeinitializer* deinitializer;
  86. SensorUpdater* updater;
  87. uint32_t lastPollingTime;
  88. uint16_t pollingInterval;
  89. } Sensor;
  90. /**
  91. * @brief Получить имя типа датчика
  92. *
  93. * @param st Тип датчика
  94. * @return Указатель на строку с именем типа датчика
  95. */
  96. const char* unitemp_getSensorTypeName(SensorType st);
  97. /**
  98. * @brief Конвертация номера порта на корпусе FZ в GPIO
  99. *
  100. * @param name Номер порта на корпусе FZ
  101. * @return Указатель на GPIO при успехе, NULL при ошибке
  102. */
  103. const GPIO* unitemp_GPIO_getFromInt(uint8_t name);
  104. /**
  105. * @brief Конвертация GPIO в номер на корпусе FZ
  106. *
  107. * @param gpio Указатель на порт
  108. * @return Номер порта на корпусе FZ
  109. */
  110. uint8_t unitemp_GPIO_toInt(const GpioPin* gpio);
  111. /**
  112. * @brief Выделение памяти под датчик
  113. *
  114. * @param name Имя датчика
  115. * @param st Тип датчика
  116. * @param anotherValues Массив других различных значений
  117. * @return Указатель на датчик
  118. */
  119. Sensor* unitemp_sensor_alloc(char* name, SensorType st, uint16_t* anotherValues);
  120. /**
  121. * @brief Инициализация загруженных датчиков
  122. *
  123. * @return Истина если всё прошло успешно
  124. */
  125. bool unitemp_sensors_init(void);
  126. /**
  127. * @brief Деинициализация загруженных датчиков
  128. *
  129. * @return Истина если всё прошло успешно
  130. */
  131. bool unitemp_sensors_deInit(void);
  132. /**
  133. * @brief Получение данных указанного датчика
  134. *
  135. * @param sensor Указатель на датчик
  136. * @return Статус опроса датчика
  137. */
  138. UnitempStatus unitemp_sensor_updateData(Sensor* sensor);
  139. /**
  140. * @brief Функция загрузки датчиков с SD-карты
  141. *
  142. * @return Истина если загрузка прошла успешно
  143. */
  144. bool unitemp_sensors_load();
  145. /**
  146. * @brief Сохранение настроек на SD-карту
  147. *
  148. * @return Истина если сохранение прошло успешно
  149. */
  150. bool unitemp_sensors_save(void);
  151. /**
  152. * @brief Обновить данные со всех датчиков
  153. */
  154. void unitemp_sensors_updateValues(void);
  155. /**
  156. * @brief Высвыбождение памяти после датчиков
  157. */
  158. void unitemp_sensors_free(void);
  159. #endif