SensorsList_view.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. if(index == unitemp_sensors_getTypesCount()) {
  30. unitemp_widget_help_switch();
  31. return;
  32. }
  33. const SensorType* type = unitemp_sensors_getTypes()[index];
  34. uint8_t sensor_type_count = 0;
  35. //Подсчёт имеющихся датчиков данного типа
  36. for(uint8_t i = 0; i < unitemp_sensors_getActiveCount(); i++) {
  37. if(unitemp_sensor_getActive(i)->type == type) {
  38. sensor_type_count++;
  39. }
  40. }
  41. //Имя датчка
  42. char sensor_name[11];
  43. //Добавление счётчика к имени если такой датчик имеется
  44. if(sensor_type_count == 0)
  45. snprintf(sensor_name, 11, "%s", type->typename);
  46. else
  47. snprintf(sensor_name, 11, "%s_%d", type->typename, sensor_type_count);
  48. char args[22] = {0};
  49. //Проверка доступности датчика
  50. if(unitemp_gpio_getAviablePort(type->interface, 0, NULL) == NULL) {
  51. if(type->interface == &SINGLE_WIRE || type->interface == &ONE_WIRE) {
  52. unitemp_popup(
  53. &I_Cry_dolph_55x52, "Sensor is unavailable", "All GPIOs\nare busy", VIEW_ID);
  54. }
  55. if(type->interface == &I2C) {
  56. unitemp_popup(
  57. &I_Cry_dolph_55x52, "Sensor is unavailable", "GPIOs 15 or 16\nare busy", VIEW_ID);
  58. }
  59. return;
  60. }
  61. //Выбор первого доступного порта для датчика single wire
  62. if(type->interface == &SINGLE_WIRE) {
  63. snprintf(
  64. args,
  65. 4,
  66. "%d",
  67. unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0, NULL)));
  68. }
  69. //Выбор первого доступного порта для датчика one wire и запись нулевого ID
  70. if(type->interface == &ONE_WIRE) {
  71. snprintf(
  72. args,
  73. 21,
  74. "%d %02X%02X%02X%02X%02X%02X%02X%02X",
  75. unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0, NULL)),
  76. 0,
  77. 0,
  78. 0,
  79. 0,
  80. 0,
  81. 0,
  82. 0,
  83. 0);
  84. }
  85. //Для I2C адрес выберется автоматически
  86. unitemp_SensorEdit_switch(unitemp_sensor_alloc(sensor_name, type, args));
  87. }
  88. /**
  89. * @brief Создание меню редактирования настроек
  90. */
  91. void unitemp_SensorsList_alloc(void) {
  92. variable_item_list = variable_item_list_alloc();
  93. //Сброс всех элементов меню
  94. variable_item_list_reset(variable_item_list);
  95. //Добавление в список доступных датчиков
  96. for(uint8_t i = 0; i < unitemp_sensors_getTypesCount(); i++) {
  97. if(unitemp_sensors_getTypes()[i]->altname == NULL) {
  98. variable_item_list_add(
  99. variable_item_list, unitemp_sensors_getTypes()[i]->typename, 1, NULL, app);
  100. } else {
  101. variable_item_list_add(
  102. variable_item_list, unitemp_sensors_getTypes()[i]->altname, 1, NULL, app);
  103. }
  104. }
  105. variable_item_list_add(variable_item_list, "I don't know what to choose", 1, NULL, app);
  106. //Добавление колбека на нажатие средней кнопки
  107. variable_item_list_set_enter_callback(variable_item_list, _enter_callback, app);
  108. //Создание вида из списка
  109. view = variable_item_list_get_view(variable_item_list);
  110. //Добавление колбека на нажатие кнопки "Назад"
  111. view_set_previous_callback(view, _exit_callback);
  112. //Добавление вида в диспетчер
  113. view_dispatcher_add_view(app->view_dispatcher, VIEW_ID, view);
  114. }
  115. void unitemp_SensorsList_switch(void) {
  116. //Обнуление последнего выбранного пункта
  117. variable_item_list_set_selected_item(variable_item_list, 0);
  118. view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_ID);
  119. }
  120. void unitemp_SensorsList_free(void) {
  121. //Очистка списка элементов
  122. variable_item_list_free(variable_item_list);
  123. //Очистка вида
  124. view_free(view);
  125. //Удаление вида после обработки
  126. view_dispatcher_remove_view(app->view_dispatcher, VIEW_ID);
  127. }