SensorsList_view.c 4.3 KB

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