Sensors.h 5.5 KB

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