Victor пре 3 година
родитељ
комит
1fd29d3d7b

BIN
assets/repo_qr_50x50.png


BIN
assets/sherlok_53x45.png


BIN
assets/sherlok_53x55.png


+ 9 - 7
unitemp.c

@@ -10,13 +10,19 @@
 //TODO: В меню выбора нового датчика добавить помогалку выбора датчика
 //TODO: Help, about
 //TODO: Добавить настройку единицы измерения давления
-//TODO: Ограничивать длину имени датчика только тогда, когда имя действительно не вмещается
 //TODO: Обновлять данные только с тех датчиков, которые присутствуют на экране
 
 /* ******************************* Датчики ******************************* */
+//TODO: Исправить некорректное отображение пина при редактировании (отловлено на DHT11)
+
 //TODO: Ограничение на добавление датчика I2C с адресом уже имеющегося датчика
 //TODO: BMP280 SPI
 
+/* ******************************** Общее ******************************** */
+//TODO: Описание на Github
+//TODO: Описание подключения датчиков
+//TODO: Лицензия и авторство в каждом файле
+
 /* Переменные */
 //Данные приложения
 Unitemp* app;
@@ -206,11 +212,7 @@ static bool unitemp_alloc(void) {
     unitemp_SensorEdit_alloc();
     unitemp_SensorNameEdit_alloc();
     unitemp_SensorActions_alloc();
-
-    //Виджет
-    app->widget = widget_alloc();
-    view_dispatcher_add_view(
-        app->view_dispatcher, UnitempViewSensorDelete, widget_get_view(app->widget));
+    unitemp_widgets_alloc();
 
     //Всплывающее окно
     app->popup = popup_alloc();
@@ -226,7 +228,7 @@ static bool unitemp_alloc(void) {
  */
 static void unitemp_free(void) {
     popup_free(app->popup);
-    widget_free(app->widget);
+    unitemp_widgets_free();
 
     unitemp_SensorActions_free();
     unitemp_SensorNameEdit_free();

+ 1 - 1
views/General_view.c

@@ -139,7 +139,7 @@ static void _draw_singleSensor(Canvas* canvas, Sensor* sensor, const uint8_t pos
 }
 
 static void _draw_view_noSensors(Canvas* canvas) {
-    canvas_draw_icon(canvas, 7, 17, &I_sherlok_53x55);
+    canvas_draw_icon(canvas, 7, 17, &I_sherlok_53x45);
     //Рисование рамки
     canvas_draw_rframe(canvas, 0, 0, 128, 63, 7);
     canvas_draw_rframe(canvas, 0, 0, 128, 64, 7);

+ 4 - 0
views/MainMenu_view.c

@@ -33,6 +33,10 @@ static void _enter_callback(void* context, uint32_t index) {
     if(index == 1) { //Settings
         unitemp_Settings_switch();
     }
+    if(index == 2) {
+        //Help
+        unitemp_widget_help_switch();
+    }
 }
 
 /**

+ 2 - 112
views/SensorActions_view.c

@@ -17,116 +17,6 @@ extern carousel_info carousel_info_selector;
 
 #define VIEW_ID UnitempViewSensorActions
 
-/* ================== Подтверждение удаления ================== */
-/**
- * @brief Функция обработки нажатия кнопки "Назад"
- * 
- * @param context Указатель на данные приложения
- * @return ID вида в который нужно переключиться
- */
-static uint32_t _delete_exit_callback(void* context) {
-    UNUSED(context);
-    //Возвращаем ID вида, в который нужно вернуться
-    return UnitempViewSensorActions;
-}
-/**
- * @brief Обработчик нажатий на кнопку в виджете
- * 
- * @param result Какая из кнопок была нажата
- * @param type Тип нажатия
- * @param context Указатель на данные плагина
- */
-static void _delete_click_callback(GuiButtonType result, InputType type, void* context) {
-    UNUSED(context);
-    //Коротко нажата левая кнопка (Cancel)
-    if(result == GuiButtonTypeLeft && type == InputTypeShort) {
-        unitemp_SensorActions_switch(current_sensor);
-    }
-    //Коротко нажата правая кнопка (Delete)
-    if(result == GuiButtonTypeRight && type == InputTypeShort) {
-        //Удаление датчика
-        unitemp_sensor_delete(current_sensor);
-        //Выход из меню
-        unitemp_General_switch();
-    }
-}
-/**
- * @brief Переключение в виджет удаления датчика
- */
-static void _delete_widget_switch(void) {
-    //Очистка виджета
-    widget_reset(app->widget);
-    //Добавление кнопок
-    widget_add_button_element(
-        app->widget, GuiButtonTypeLeft, "Cancel", _delete_click_callback, app);
-    widget_add_button_element(
-        app->widget, GuiButtonTypeRight, "Delete", _delete_click_callback, app);
-
-    char delete_str[32];
-    snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", current_sensor->name);
-    widget_add_text_box_element(
-        app->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str, false);
-
-    if(current_sensor->type->interface == &ONE_WIRE) {
-        OneWireSensor* s = current_sensor->instance;
-
-        snprintf(
-            delete_str,
-            sizeof(delete_str),
-            "\e#Type:\e# %s",
-            unitemp_onewire_sensor_getModel(current_sensor));
-        widget_add_text_box_element(
-            app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, delete_str, false);
-        snprintf(delete_str, sizeof(delete_str), "\e#GPIO:\e# %s", s->bus->gpio->name);
-        widget_add_text_box_element(
-            app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, delete_str, false);
-
-        snprintf(
-            delete_str,
-            sizeof(delete_str),
-            "\e#ID:\e# %02X%02X%02X%02X%02X%02X%02X%02X",
-            s->deviceID[0],
-            s->deviceID[1],
-            s->deviceID[2],
-            s->deviceID[3],
-            s->deviceID[4],
-            s->deviceID[5],
-            s->deviceID[6],
-            s->deviceID[7]);
-        widget_add_text_box_element(
-            app->widget, 0, 40, 128, 23, AlignLeft, AlignTop, delete_str, false);
-    }
-
-    if(current_sensor->type->interface == &SINGLE_WIRE) {
-        snprintf(delete_str, sizeof(delete_str), "\e#Type:\e# %s", current_sensor->type->typename);
-        widget_add_text_box_element(
-            app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, delete_str, false);
-        snprintf(
-            delete_str,
-            sizeof(delete_str),
-            "\e#GPIO:\e# %s",
-            ((SingleWireSensor*)current_sensor->instance)->gpio->name);
-        widget_add_text_box_element(
-            app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, delete_str, false);
-    }
-
-    if(current_sensor->type->interface == &I2C) {
-        snprintf(delete_str, sizeof(delete_str), "\e#Type:\e# %s", current_sensor->type->typename);
-        widget_add_text_box_element(
-            app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, delete_str, false);
-        snprintf(
-            delete_str,
-            sizeof(delete_str),
-            "\e#I2C addr:\e# 0x%02X",
-            ((I2CSensor*)current_sensor->instance)->currentI2CAdr);
-        widget_add_text_box_element(
-            app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, delete_str, false);
-    }
-
-    view_set_previous_callback(widget_get_view(app->widget), _delete_exit_callback);
-    view_dispatcher_switch_to_view(app->view_dispatcher, UnitempViewSensorDelete);
-}
-
 /**
  * @brief Функция обработки нажатия кнопки "Назад"
  *
@@ -156,7 +46,7 @@ static void _enter_callback(void* context, uint32_t index) {
         unitemp_SensorEdit_switch(current_sensor);
         break;
     case 2:
-        _delete_widget_switch();
+        unitemp_widget_delete_switch(current_sensor);
         break;
     case 3:
         unitemp_SensorsList_switch();
@@ -165,7 +55,7 @@ static void _enter_callback(void* context, uint32_t index) {
         unitemp_Settings_switch();
         break;
     case 5:
-        //Help
+        unitemp_widget_help_switch();
         break;
     case 6:
         //About

+ 6 - 0
views/SensorsList_view.c

@@ -30,6 +30,11 @@ static uint32_t _exit_callback(void* context) {
  */
 static void _enter_callback(void* context, uint32_t index) {
     UNUSED(context);
+    if(index == unitemp_sensors_getTypesCount()) {
+        unitemp_widget_help_switch();
+        return;
+    }
+
     const SensorType* type = unitemp_sensors_getTypes()[index];
     uint8_t sensor_type_count = 0;
 
@@ -110,6 +115,7 @@ void unitemp_SensorsList_alloc(void) {
                 variable_item_list, unitemp_sensors_getTypes()[i]->altname, 1, NULL, app);
         }
     }
+    variable_item_list_add(variable_item_list, "I don't know what to choose", 1, NULL, app);
 
     //Добавление колбека на нажатие средней кнопки
     variable_item_list_set_enter_callback(variable_item_list, _enter_callback, app);

+ 9 - 1
views/UnitempViews.h

@@ -12,7 +12,7 @@ typedef enum UnitempViews {
     UnitempViewSensorEdit,
     UnitempViewSensorNameEdit,
     UnitempViewSensorActions,
-    UnitempViewSensorDelete,
+    UnitempViewWidget,
     UnitempViewPopup,
 
     UnitempViewsCount
@@ -64,4 +64,12 @@ void unitemp_SensorActions_alloc(void);
 void unitemp_SensorActions_switch(Sensor* sensor);
 void unitemp_SensorActions_free(void);
 
+/* Виджеты */
+void unitemp_widgets_alloc(void);
+void unitemp_widgets_free(void);
+
+/* Подтверждение удаления */
+void unitemp_widget_delete_switch(Sensor* sensor);
+/* Помощь */
+void unitemp_widget_help_switch(void);
 #endif

+ 159 - 0
views/Widgets_view.c

@@ -0,0 +1,159 @@
+#include "UnitempViews.h"
+#include "unitemp_icons.h"
+
+#include <assets_icons.h>
+
+void unitemp_widgets_alloc(void) {
+    app->widget = widget_alloc();
+    view_dispatcher_add_view(
+        app->view_dispatcher, UnitempViewWidget, widget_get_view(app->widget));
+}
+
+void unitemp_widgets_free(void) {
+    widget_free(app->widget);
+}
+
+/* ================== Подтверждение удаления ================== */
+Sensor* current_sensor;
+/**
+ * @brief Функция обработки нажатия кнопки "Назад"
+ * 
+ * @param context Указатель на данные приложения
+ * @return ID вида в который нужно переключиться
+ */
+static uint32_t _delete_exit_callback(void* context) {
+    UNUSED(context);
+    //Возвращаем ID вида, в который нужно вернуться
+    return UnitempViewSensorActions;
+}
+/**
+ * @brief Обработчик нажатий на кнопку в виджете
+ * 
+ * @param result Какая из кнопок была нажата
+ * @param type Тип нажатия
+ * @param context Указатель на данные плагина
+ */
+static void _delete_click_callback(GuiButtonType result, InputType type, void* context) {
+    UNUSED(context);
+    //Коротко нажата левая кнопка (Cancel)
+    if(result == GuiButtonTypeLeft && type == InputTypeShort) {
+        unitemp_SensorActions_switch(current_sensor);
+    }
+    //Коротко нажата правая кнопка (Delete)
+    if(result == GuiButtonTypeRight && type == InputTypeShort) {
+        //Удаление датчика
+        unitemp_sensor_delete(current_sensor);
+        //Выход из меню
+        unitemp_General_switch();
+    }
+}
+/**
+ * @brief Переключение в виджет удаления датчика
+ */
+void unitemp_widget_delete_switch(Sensor* sensor) {
+    current_sensor = sensor;
+    //Очистка виджета
+    widget_reset(app->widget);
+    //Добавление кнопок
+    widget_add_button_element(
+        app->widget, GuiButtonTypeLeft, "Cancel", _delete_click_callback, app);
+    widget_add_button_element(
+        app->widget, GuiButtonTypeRight, "Delete", _delete_click_callback, app);
+
+    snprintf(app->buff, BUFF_SIZE, "\e#Delete %s?\e#", current_sensor->name);
+    widget_add_text_box_element(
+        app->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, app->buff, false);
+
+    if(current_sensor->type->interface == &ONE_WIRE) {
+        OneWireSensor* s = current_sensor->instance;
+
+        snprintf(
+            app->buff,
+            BUFF_SIZE,
+            "\e#Type:\e# %s",
+            unitemp_onewire_sensor_getModel(current_sensor));
+        widget_add_text_box_element(
+            app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, app->buff, false);
+        snprintf(app->buff, BUFF_SIZE, "\e#GPIO:\e# %s", s->bus->gpio->name);
+        widget_add_text_box_element(
+            app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, app->buff, false);
+
+        snprintf(
+            app->buff,
+            BUFF_SIZE,
+            "\e#ID:\e# %02X%02X%02X%02X%02X%02X%02X%02X",
+            s->deviceID[0],
+            s->deviceID[1],
+            s->deviceID[2],
+            s->deviceID[3],
+            s->deviceID[4],
+            s->deviceID[5],
+            s->deviceID[6],
+            s->deviceID[7]);
+        widget_add_text_box_element(
+            app->widget, 0, 40, 128, 23, AlignLeft, AlignTop, app->buff, false);
+    }
+
+    if(current_sensor->type->interface == &SINGLE_WIRE) {
+        snprintf(app->buff, BUFF_SIZE, "\e#Type:\e# %s", current_sensor->type->typename);
+        widget_add_text_box_element(
+            app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, app->buff, false);
+        snprintf(
+            app->buff,
+            BUFF_SIZE,
+            "\e#GPIO:\e# %s",
+            ((SingleWireSensor*)current_sensor->instance)->gpio->name);
+        widget_add_text_box_element(
+            app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, app->buff, false);
+    }
+
+    if(current_sensor->type->interface == &I2C) {
+        snprintf(app->buff, BUFF_SIZE, "\e#Type:\e# %s", current_sensor->type->typename);
+        widget_add_text_box_element(
+            app->widget, 0, 16, 128, 23, AlignLeft, AlignTop, app->buff, false);
+        snprintf(
+            app->buff,
+            BUFF_SIZE,
+            "\e#I2C addr:\e# 0x%02X",
+            ((I2CSensor*)current_sensor->instance)->currentI2CAdr);
+        widget_add_text_box_element(
+            app->widget, 0, 28, 128, 23, AlignLeft, AlignTop, app->buff, false);
+    }
+
+    view_set_previous_callback(widget_get_view(app->widget), _delete_exit_callback);
+    view_dispatcher_switch_to_view(app->view_dispatcher, UnitempViewWidget);
+}
+
+/* ========================== Помощь ========================== */
+
+/**
+ * @brief Функция обработки нажатия кнопки "Назад"
+ * 
+ * @param context Указатель на данные приложения
+ * @return ID вида в который нужно переключиться
+ */
+static uint32_t _help_exit_callback(void* context) {
+    UNUSED(context);
+    //Возвращаем ID вида, в который нужно вернуться
+    return UnitempViewGeneral;
+}
+
+/**
+ * @brief Переключение в виджет помощи
+ */
+void unitemp_widget_help_switch(void) {
+    //Очистка виджета
+    widget_reset(app->widget);
+
+    widget_add_icon_element(app->widget, 3, 7, &I_repo_qr_50x50);
+    widget_add_icon_element(app->widget, 71, 15, &I_DolphinCommon_56x48);
+
+    widget_add_string_multiline_element(
+        app->widget, 55, 5, AlignLeft, AlignTop, FontSecondary, "You can find help\nthere");
+
+    widget_add_frame_element(app->widget, 0, 0, 128, 63, 7);
+    widget_add_frame_element(app->widget, 0, 0, 128, 64, 7);
+
+    view_set_previous_callback(widget_get_view(app->widget), _help_exit_callback);
+    view_dispatcher_switch_to_view(app->view_dispatcher, UnitempViewWidget);
+}