SensorsList_view.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "UnitempViews.h"
  2. #include <gui/modules/variable_item_list.h>
  3. #include <stdio.h>
  4. #include <assets_icons.h>
  5. //Текущий вид
  6. static View* view;
  7. //Список
  8. static VariableItemList* variable_item_list;
  9. #define VIEW_ID UnitempViewSensorsList
  10. /**
  11. * @brief Функция обработки нажатия кнопки "Назад"
  12. *
  13. * @param context Указатель на данные приложения
  14. * @return ID вида в который нужно переключиться
  15. */
  16. static uint32_t _exit_callback(void* context) {
  17. UNUSED(context);
  18. //Возврат предыдущий вид
  19. return UnitempViewGeneral;
  20. }
  21. /**
  22. * @brief Функция обработки нажатия средней кнопки
  23. *
  24. * @param context Указатель на данные приложения
  25. * @param index На каком элементе списка была нажата кнопка
  26. */
  27. static void _enter_callback(void* context, uint32_t index) {
  28. UNUSED(context);
  29. const SensorType* type = unitemp_sensors_getTypes()[index];
  30. uint8_t sensor_type_count = 0;
  31. //Подсчёт имеющихся датчиков данного типа
  32. for(uint8_t i = 0; i < unitemp_sensors_getActiveCount(); i++) {
  33. if(unitemp_sensor_getActive(i)->type == type) {
  34. sensor_type_count++;
  35. }
  36. }
  37. //Имя датчка
  38. char sensor_name[11];
  39. //Добавление счётчика к имени если такой датчик имеется
  40. if(sensor_type_count == 0)
  41. snprintf(sensor_name, 11, "%s", type->typename);
  42. else
  43. snprintf(sensor_name, 11, "%s_%d", type->typename, sensor_type_count);
  44. char args[22] = {0};
  45. //Проверка доступности датчика
  46. if(unitemp_gpio_getAviablePort(type->interface, 0, NULL) == NULL) {
  47. if(type->interface == &SINGLE_WIRE || type->interface == &ONE_WIRE) {
  48. unitemp_popup(
  49. &I_Cry_dolph_55x52, "Sensor is unavailable", "All GPIOs\nare busy", VIEW_ID);
  50. }
  51. if(type->interface == &I2C) {
  52. unitemp_popup(
  53. &I_Cry_dolph_55x52, "Sensor is unavailable", "GPIOs 15 or 16\nare busy", VIEW_ID);
  54. }
  55. return;
  56. }
  57. //Выбор первого доступного порта для датчика single wire
  58. if(type->interface == &SINGLE_WIRE) {
  59. snprintf(
  60. args,
  61. 4,
  62. "%d",
  63. unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0, NULL)));
  64. }
  65. //Выбор первого доступного порта для датчика one wire и запись нулевого ID
  66. if(type->interface == &ONE_WIRE) {
  67. snprintf(
  68. args,
  69. 21,
  70. "%d %02X%02X%02X%02X%02X%02X%02X%02X",
  71. unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0, NULL)),
  72. 0,
  73. 0,
  74. 0,
  75. 0,
  76. 0,
  77. 0,
  78. 0,
  79. 0);
  80. }
  81. //Для I2C адрес выберется автоматически
  82. unitemp_SensorEdit_switch(unitemp_sensor_alloc(sensor_name, type, args));
  83. }
  84. /**
  85. * @brief Создание меню редактирования настроек
  86. */
  87. void unitemp_SensorsList_alloc(void) {
  88. variable_item_list = variable_item_list_alloc();
  89. //Сброс всех элементов меню
  90. variable_item_list_reset(variable_item_list);
  91. //Добавление в список доступных датчиков
  92. for(uint8_t i = 0; i < unitemp_sensors_getTypesCount(); i++) {
  93. if(unitemp_sensors_getTypes()[i]->altname == NULL) {
  94. variable_item_list_add(
  95. variable_item_list, unitemp_sensors_getTypes()[i]->typename, 1, NULL, app);
  96. } else {
  97. variable_item_list_add(
  98. variable_item_list, unitemp_sensors_getTypes()[i]->altname, 1, NULL, app);
  99. }
  100. }
  101. //Добавление колбека на нажатие средней кнопки
  102. variable_item_list_set_enter_callback(variable_item_list, _enter_callback, app);
  103. //Создание вида из списка
  104. view = variable_item_list_get_view(variable_item_list);
  105. //Добавление колбека на нажатие кнопки "Назад"
  106. view_set_previous_callback(view, _exit_callback);
  107. //Добавление вида в диспетчер
  108. view_dispatcher_add_view(app->view_dispatcher, VIEW_ID, view);
  109. }
  110. void unitemp_SensorsList_switch(void) {
  111. //Обнуление последнего выбранного пункта
  112. variable_item_list_set_selected_item(variable_item_list, 0);
  113. view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_ID);
  114. }
  115. void unitemp_SensorsList_free(void) {
  116. //Очистка списка элементов
  117. variable_item_list_free(variable_item_list);
  118. //Очистка вида
  119. view_free(view);
  120. //Удаление вида после обработки
  121. view_dispatcher_remove_view(app->view_dispatcher, VIEW_ID);
  122. }