Sensors.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. UT_POLLING, //В датчике происходит преобразование
  13. } UnitempStatus;
  14. //Порт ввода/вывода Flipper Zero
  15. typedef struct GPIO {
  16. const uint8_t num;
  17. const char* name;
  18. const GpioPin* pin;
  19. } GPIO;
  20. typedef struct Sensor Sensor;
  21. /**
  22. * @brief Указатель функции выделения памяти и подготовки экземпляра датчика
  23. */
  24. typedef bool(SensorAllocator)(Sensor* sensor, char* args);
  25. /**
  26. * @brief Указатель на функцию высвобождении памяти датчика
  27. */
  28. typedef bool(SensorFree)(Sensor* sensor);
  29. /**
  30. * @brief Указатель функции инициализации датчика
  31. */
  32. typedef bool(SensorInitializer)(Sensor* sensor);
  33. /**
  34. * @brief Указатель функции деинициализации датчика
  35. */
  36. typedef bool(SensorDeinitializer)(Sensor* sensor);
  37. /**
  38. * @brief Указатель функции обновления значения датчика
  39. */
  40. typedef UnitempStatus(SensorUpdater)(Sensor* sensor);
  41. //Типы подключения датчиков
  42. typedef struct Interface {
  43. //Имя интерфейса
  44. const char* name;
  45. //Функция выделения памяти интерфейса
  46. SensorAllocator* allocator;
  47. //Функция высвыбождения памяти интерфейса
  48. SensorFree* mem_releaser;
  49. //Функция обновления значения датчика по интерфейсу
  50. SensorUpdater* updater;
  51. } Interface;
  52. //Типы датчиков
  53. typedef struct {
  54. //Имя типа датчика
  55. const char* typename;
  56. //Интерфейс подключения
  57. const Interface* interface;
  58. //Интервал опроса датчика
  59. uint16_t pollingInterval;
  60. //Функция выделения памяти для датчика
  61. SensorAllocator* allocator;
  62. //Функция высвыбождения памяти для датчика
  63. SensorFree* mem_releaser;
  64. //Функция инициализации датчика
  65. SensorInitializer* initializer;
  66. //Функция деинициализация датчика
  67. SensorDeinitializer* deinitializer;
  68. //Функция обновления значения датчка
  69. SensorUpdater* updater;
  70. } SensorType;
  71. //Датчик
  72. typedef struct Sensor {
  73. //Имя датчика
  74. char* name;
  75. //Температура
  76. float temp;
  77. //Относительная влажность
  78. float hum;
  79. //Тип датчика
  80. const SensorType* type;
  81. //Статус последнего опроса датчика
  82. UnitempStatus status;
  83. //Время последнего опроса датчика
  84. uint32_t lastPollingTime;
  85. //Экземпляр датчика
  86. void* instance;
  87. } Sensor;
  88. extern const Interface SINGLE_WIRE; //Собственный однопроводной протокол датчиков DHTXX и AM23XX
  89. extern const Interface ONE_WIRE; //Однопроводной протокол Dallas
  90. extern const Interface I2C; //I2C_2 (PC0, PC1)
  91. //extern const Interface SPI;
  92. /* ============================= Датчик(и) ============================= */
  93. /**
  94. * @brief Выделение памяти под датчик
  95. *
  96. * @param name Имя датчика
  97. * @param type Тип датчика
  98. * @param args Указатель на строку с парамерами датчика
  99. * @return Указатель на датчик в случае успешного выделения памяти, NULL при ошибке
  100. */
  101. Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, char* args);
  102. /**
  103. * @brief Высвыбождение памяти конкретного датчка
  104. * @param sensor Указатель на датчик
  105. */
  106. void unitemp_sensor_free(Sensor* sensor);
  107. /**
  108. * @brief Обновление данных указанного датчика
  109. * @param sensor Указатель на датчик
  110. * @return Статус опроса датчика
  111. */
  112. UnitempStatus unitemp_sensor_updateData(Sensor* sensor);
  113. /**
  114. * @brief Загрузка датчиков с SD-карты
  115. * @return Истина если загрузка прошла успешно
  116. */
  117. bool unitemp_sensors_load();
  118. /**
  119. * @brief Функция перезагрузки датчиков с SD-карты
  120. */
  121. void unitemp_sensors_reload(void);
  122. /**
  123. * @brief Сохранение настроек на SD-карту
  124. * @return Истина если сохранение прошло успешно
  125. */
  126. bool unitemp_sensors_save(void);
  127. /**
  128. * @brief Инициализация загруженных датчиков
  129. * @return Истина если всё прошло успешно
  130. */
  131. bool unitemp_sensors_init(void);
  132. /**
  133. * @brief Деинициализация загруженных датчиков
  134. * @return Истина если всё прошло успешно
  135. */
  136. bool unitemp_sensors_deInit(void);
  137. /**
  138. * @brief Высвыбождение памяти всех датчиков
  139. */
  140. void unitemp_sensors_free(void);
  141. /**
  142. * @brief Обновить данные всех датчиков
  143. */
  144. void unitemp_sensors_updateValues(void);
  145. /**
  146. * @brief Получить количество загруженных датчиков
  147. * @return Количество датчиков
  148. */
  149. uint8_t unitemp_sensors_getCount(void);
  150. /**
  151. * @brief Добавить датчик в общий список
  152. * @param sensor Указатель на датчик
  153. */
  154. void unitemp_sensors_add(Sensor* sensor);
  155. /**
  156. * @brief Получить списк доступных типов датчиков
  157. * @return Указатель на список датчиков
  158. */
  159. const SensorType** unitemp_sensors_getTypes(void);
  160. /**
  161. * @brief Получить количество доступных типов датчиков
  162. * @return Количество доступных типов датчиков
  163. */
  164. uint8_t unitemp_sensors_getTypesCount(void);
  165. /**
  166. * @brief Получить тип сенсора по его индексу
  167. * @param index Индекс типа датчика (от 0 до SENSOR_TYPES_COUNT)
  168. * @return const SensorType*
  169. */
  170. const SensorType* unitemp_sensors_getTypeFromInt(uint8_t index);
  171. /**
  172. * @brief Преобразовать строчное название датчка в указатель
  173. *
  174. * @param str Имя датчика в виде строки
  175. * @return Указатель на тип датчика при успехе, иначе NULL
  176. */
  177. const SensorType* unitemp_sensors_getTypeFromStr(char* str);
  178. /* ============================= GPIO ============================= */
  179. /**
  180. * @brief Конвертация номера порта на корпусе FZ в GPIO
  181. * @param name Номер порта на корпусе FZ
  182. * @return Указатель на GPIO при успехе, NULL при ошибке
  183. */
  184. const GPIO* unitemp_gpio_getFromInt(uint8_t name);
  185. /**
  186. * @brief Конвертация GPIO в номер на корпусе FZ
  187. * @param gpio Указатель на порт
  188. * @return Номер порта на корпусе FZ
  189. */
  190. uint8_t unitemp_gpio_toInt(const GPIO* gpio);
  191. /**
  192. * @brief Блокировка GPIO указанным интерфейсом
  193. * @param gpio Указатель на порт
  194. * @param interface Указатель на интерфейс, которым порт будет занят
  195. */
  196. void unitemp_gpio_lock(const GPIO* gpio, const Interface* interface);
  197. /**
  198. * @brief Разблокировка порта
  199. * @param gpio Указатель на порт
  200. */
  201. void unitemp_gpio_unlock(const GPIO* gpio);
  202. /**
  203. * @brief Получить количество доступных портов для указанного интерфейса
  204. * @param interface Указатель на интерфейс
  205. * @return Количество доступных портов
  206. */
  207. uint8_t unitemp_gpio_getAviablePortsCount(const Interface* interface);
  208. /**
  209. * @brief Получить указатель на доступный для интерфейса порт по индексу
  210. * @param interface Указатель на интерфейс
  211. * @param index Номер порта (от 0 до unitemp_gpio_getAviablePortsCount())
  212. * @return Указатель на доступный порт
  213. */
  214. const GPIO* unitemp_gpio_getAviablePort(const Interface* interface, uint8_t index);
  215. /* Датчики */
  216. //DHTxx и их производные
  217. #include "./interfaces/SingleWireSensor.h"
  218. //DS18x2x
  219. #include "./interfaces/OneWireSensor.h"
  220. #include "./sensors/LM75.h"
  221. #include "./sensors/BMP280.h"
  222. #endif