Sensors.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. /**
  21. * @brief Указатель функции выделения памяти и подготовки экземпляра датчика
  22. */
  23. typedef bool(SensorAllocator)(void* sensor, uint16_t* anotherValues);
  24. /**
  25. * @brief Указатель на функцию высвобождении памяти датчика
  26. */
  27. typedef bool(SensorFree)(void* sensor);
  28. /**
  29. * @brief Указатель функции инициализации датчика
  30. */
  31. typedef bool(SensorInitializer)(void* sensor);
  32. /**
  33. * @brief Указатель функции деинициализации датчика
  34. */
  35. typedef bool(SensorDeinitializer)(void* sensor);
  36. /**
  37. * @brief Указатель функции обновления значения датчика
  38. */
  39. typedef UnitempStatus(SensorUpdater)(void* sensor);
  40. //Типы подключения датчиков
  41. typedef struct Interface {
  42. const char* name;
  43. SensorAllocator* allocator;
  44. //Функция высвыбождения памяти для датчика
  45. SensorFree* mem_releaser;
  46. //Функция обновления значения датчка
  47. SensorUpdater* updater;
  48. } Interface;
  49. //Типы датчиков
  50. typedef struct {
  51. //Имя типа датчика
  52. const char* typename;
  53. //Интерфейс подключения
  54. const Interface* interface;
  55. //Интервал опроса датчика
  56. uint16_t pollingInterval;
  57. //Функция выделения памяти для датчика
  58. SensorAllocator* allocator;
  59. //Функция высвыбождения памяти для датчика
  60. SensorFree* mem_releaser;
  61. //Функция инициализации датчика
  62. SensorInitializer* initializer;
  63. //Функция деинициализация датчика
  64. SensorDeinitializer* deinitializer;
  65. //Функция обновления значения датчка
  66. SensorUpdater* updater;
  67. } SensorType;
  68. //Датчик
  69. typedef struct Sensor {
  70. //Имя датчика
  71. char* name;
  72. //Температура
  73. float temp;
  74. //Относительная влажность
  75. float hum;
  76. //Тип датчика
  77. const SensorType* type;
  78. //Статус последнего опроса датчика
  79. UnitempStatus status;
  80. //Время последнего опроса датчика
  81. uint32_t lastPollingTime;
  82. //Экземпляр датчика
  83. void* instance;
  84. } Sensor;
  85. extern const Interface SINGLE_WIRE; //Собственный однопроводной протокол датчиков DHTXX и AM23XX
  86. extern const Interface ONE_WIRE; //Однопроводной протокол Dallas
  87. extern const Interface I2C; //I2C_2 (PC0, PC1)
  88. //extern const Interface SPI;
  89. /**
  90. * @brief Конвертация номера порта на корпусе FZ в GPIO
  91. *
  92. * @param name Номер порта на корпусе FZ
  93. * @return Указатель на GPIO при успехе, NULL при ошибке
  94. */
  95. const GPIO* unitemp_GPIO_getFromInt(uint8_t name);
  96. /**
  97. * @brief Конвертация GPIO в номер на корпусе FZ
  98. *
  99. * @param gpio Указатель на порт
  100. * @return Номер порта на корпусе FZ
  101. */
  102. uint8_t unitemp_GPIO_toInt(const GpioPin* gpio);
  103. /**
  104. * @brief Выделение памяти под датчик
  105. *
  106. * @param name Имя датчика
  107. * @param st Тип датчика
  108. * @param anotherValues Массив других различных значений
  109. * @return Указатель на датчик
  110. */
  111. Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, uint16_t* anotherValues);
  112. /**
  113. * @brief Инициализация загруженных датчиков
  114. *
  115. * @return Истина если всё прошло успешно
  116. */
  117. bool unitemp_sensors_init(void);
  118. /**
  119. * @brief Деинициализация загруженных датчиков
  120. *
  121. * @return Истина если всё прошло успешно
  122. */
  123. bool unitemp_sensors_deInit(void);
  124. /**
  125. * @brief Получение данных указанного датчика
  126. *
  127. * @param sensor Указатель на датчик
  128. * @return Статус опроса датчика
  129. */
  130. UnitempStatus unitemp_sensor_updateData(Sensor* sensor);
  131. /**
  132. * @brief Функция загрузки датчиков с SD-карты
  133. *
  134. * @return Истина если загрузка прошла успешно
  135. */
  136. bool unitemp_sensors_load();
  137. /**
  138. * @brief Сохранение настроек на SD-карту
  139. *
  140. * @return Истина если сохранение прошло успешно
  141. */
  142. bool unitemp_sensors_save(void);
  143. /**
  144. * @brief Обновить данные со всех датчиков
  145. */
  146. void unitemp_sensors_updateValues(void);
  147. /**
  148. * @brief Высвыбождение памяти после датчиков
  149. */
  150. void unitemp_sensors_free(void);
  151. const SensorType* unitemp_getTypeFromInt(int type);
  152. #endif