SensorActions_view.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. //Текущий датчик
  9. static Sensor* current_sensor;
  10. #define VIEW_ID VIEW_SENSOR_ACTIONS
  11. /* ================== Подтверждение удаления ================== */
  12. /**
  13. * @brief Функция обработки нажатия кнопки "Назад"
  14. *
  15. * @param context Указатель на данные приложения
  16. * @return ID вида в который нужно переключиться
  17. */
  18. static uint32_t _delete_exit_callback(void* context) {
  19. UNUSED(context);
  20. //Возвращаем ID вида, в который нужно вернуться
  21. return VIEW_SENSOR_ACTIONS;
  22. }
  23. /**
  24. * @brief Обработчик нажатий на кнопку в виджете
  25. *
  26. * @param result Какая из кнопок была нажата
  27. * @param type Тип нажатия
  28. * @param context Указатель на данные плагина
  29. */
  30. static void _delete_click_callback(GuiButtonType result, InputType type, void* context) {
  31. UNUSED(context);
  32. //Коротко нажата левая кнопка (Cancel)
  33. if(result == GuiButtonTypeLeft && type == InputTypeShort) {
  34. unitemp_SensorActions_switch(current_sensor);
  35. }
  36. //Коротко нажата правая кнопка (Delete)
  37. if(result == GuiButtonTypeRight && type == InputTypeShort) {
  38. //Удаление датчика
  39. unitemp_sensor_delete(current_sensor);
  40. //Выход из меню
  41. unitemp_General_switch();
  42. }
  43. }
  44. /**
  45. * @brief Переключение в виджет удаления датчика
  46. */
  47. static void _delete_widget_switch(void) {
  48. //Очистка виджета
  49. widget_reset(app->widget);
  50. //Добавление кнопок
  51. widget_add_button_element(
  52. app->widget, GuiButtonTypeLeft, "Cancel", _delete_click_callback, app);
  53. widget_add_button_element(
  54. app->widget, GuiButtonTypeRight, "Delete", _delete_click_callback, app);
  55. char delete_str[32];
  56. snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", current_sensor->name);
  57. widget_add_text_box_element(
  58. app->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str, false);
  59. if(current_sensor->type->interface == &ONE_WIRE) {
  60. OneWireSensor* s = current_sensor->instance;
  61. snprintf(
  62. delete_str,
  63. sizeof(delete_str),
  64. "\e#Type:\e# %s",
  65. unitemp_onewire_sensor_getModel(current_sensor));
  66. widget_add_text_box_element(
  67. app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, delete_str, false);
  68. snprintf(delete_str, sizeof(delete_str), "\e#GPIO:\e# %s", s->bus->gpio->name);
  69. widget_add_text_box_element(
  70. app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, delete_str, false);
  71. snprintf(
  72. delete_str,
  73. sizeof(delete_str),
  74. "\e#ID:\e# %02X%02X%02X%02X%02X%02X%02X%02X",
  75. s->deviceID[0],
  76. s->deviceID[1],
  77. s->deviceID[2],
  78. s->deviceID[3],
  79. s->deviceID[4],
  80. s->deviceID[5],
  81. s->deviceID[6],
  82. s->deviceID[7]);
  83. widget_add_text_box_element(
  84. app->widget, 0, 40, 128, 23, AlignLeft, AlignTop, delete_str, false);
  85. }
  86. if(current_sensor->type->interface == &SINGLE_WIRE) {
  87. snprintf(delete_str, sizeof(delete_str), "\e#Type:\e# %s", current_sensor->type->typename);
  88. widget_add_text_box_element(
  89. app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, delete_str, false);
  90. snprintf(
  91. delete_str,
  92. sizeof(delete_str),
  93. "\e#GPIO:\e# %s",
  94. ((SingleWireSensor*)current_sensor->instance)->gpio->name);
  95. widget_add_text_box_element(
  96. app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, delete_str, false);
  97. }
  98. if(current_sensor->type->interface == &I2C) {
  99. snprintf(delete_str, sizeof(delete_str), "\e#Type:\e# %s", current_sensor->type->typename);
  100. widget_add_text_box_element(
  101. app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, delete_str, false);
  102. snprintf(
  103. delete_str,
  104. sizeof(delete_str),
  105. "\e#I2C addr:\e# 0x%02X",
  106. ((I2CSensor*)current_sensor->instance)->currentI2CAdr);
  107. widget_add_text_box_element(
  108. app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, delete_str, false);
  109. }
  110. view_set_previous_callback(widget_get_view(app->widget), _delete_exit_callback);
  111. view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_SENSOR_DELETE);
  112. }
  113. /**
  114. * @brief Функция обработки нажатия кнопки "Назад"
  115. *
  116. * @param context Указатель на данные приложения
  117. * @return ID вида в который нужно переключиться
  118. */
  119. static uint32_t _exit_callback(void* context) {
  120. UNUSED(context);
  121. //Возврат предыдущий вид
  122. return VIEW_GENERAL;
  123. }
  124. /**
  125. * @brief Функция обработки нажатия средней кнопки
  126. *
  127. * @param context Указатель на данные приложения
  128. * @param index На каком элементе списка была нажата кнопка
  129. */
  130. static void _enter_callback(void* context, uint32_t index) {
  131. UNUSED(context);
  132. switch(index) {
  133. case 0:
  134. unitemp_SensorEdit_switch(current_sensor);
  135. break;
  136. case 1:
  137. _delete_widget_switch();
  138. break;
  139. case 2:
  140. unitemp_SensorsList_switch();
  141. break;
  142. case 3:
  143. unitemp_Settings_switch();
  144. break;
  145. case 4:
  146. //Help
  147. break;
  148. case 5:
  149. //About
  150. break;
  151. }
  152. }
  153. /**
  154. * @brief Создание меню действий с датчиком
  155. */
  156. void unitemp_SensorActions_alloc(void) {
  157. variable_item_list = variable_item_list_alloc();
  158. //Сброс всех элементов меню
  159. variable_item_list_reset(variable_item_list);
  160. variable_item_list_add(variable_item_list, "Edit", 1, NULL, NULL);
  161. variable_item_list_add(variable_item_list, "Delete", 1, NULL, NULL);
  162. variable_item_list_add(variable_item_list, "Add new sensor", 1, NULL, NULL);
  163. variable_item_list_add(variable_item_list, "Settings", 1, NULL, NULL);
  164. variable_item_list_add(variable_item_list, "Help", 1, NULL, NULL);
  165. variable_item_list_add(variable_item_list, "About", 1, NULL, NULL);
  166. //Добавление колбека на нажатие средней кнопки
  167. variable_item_list_set_enter_callback(variable_item_list, _enter_callback, app);
  168. //Создание вида из списка
  169. view = variable_item_list_get_view(variable_item_list);
  170. //Добавление колбека на нажатие кнопки "Назад"
  171. view_set_previous_callback(view, _exit_callback);
  172. //Добавление вида в диспетчер
  173. view_dispatcher_add_view(app->view_dispatcher, VIEW_ID, view);
  174. }
  175. void unitemp_SensorActions_switch(Sensor* sensor) {
  176. current_sensor = sensor;
  177. //Обнуление последнего выбранного пункта
  178. variable_item_list_set_selected_item(variable_item_list, 0);
  179. view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_ID);
  180. }
  181. void unitemp_SensorActions_free(void) {
  182. //Очистка списка элементов
  183. variable_item_list_free(variable_item_list);
  184. //Очистка вида
  185. view_free(view);
  186. //Удаление вида после обработки
  187. view_dispatcher_remove_view(app->view_dispatcher, VIEW_ID);
  188. }