Bläddra i källkod

Small refactoring. Added the ability to view detailed information about the sensor in the carousel

Victor 3 år sedan
förälder
incheckning
fc6d5d6d5d

+ 17 - 0
interfaces/OneWireSensor.c

@@ -175,6 +175,23 @@ bool unitemp_onewire_CRC_check(uint8_t* data, uint8_t len) {
     return !crc;
 }
 
+char* unitemp_onewire_sensor_getModel(Sensor* sensor) {
+    OneWireSensor* ow_sensor = sensor->instance;
+    switch(ow_sensor->deviceID[0]) {
+    case FC_DS18B20:
+        return "DS18B20";
+        break;
+    case FC_DS18S20:
+        return "DS18S20";
+        break;
+    case FC_DS1822:
+        return "DS1822";
+        break;
+    default:
+        return "unknown";
+    }
+}
+
 bool unitemp_onewire_sensor_readID(OneWireSensor* instance) {
     if(!unitemp_onewire_bus_start(instance->bus)) return false;
     unitemp_onewire_bus_send_byte(instance->bus, 0x33); // Чтение ПЗУ

+ 8 - 0
interfaces/OneWireSensor.h

@@ -159,6 +159,14 @@ void unitemp_onewire_bus_read_byteArray(OneWireBus* bus, uint8_t* data, uint8_t
  */
 bool unitemp_onewire_CRC_check(uint8_t* data, uint8_t len);
 
+/**
+ * @brief Получить имя модели датчика на шине One Wire
+ * 
+ * @param sensor Указатель на датчик
+ * @return Указатель на строку с названием
+ */
+char* unitemp_onewire_sensor_getModel(Sensor* sensor);
+
 /**
  * @brief Чтение индификатора единственного датчика. ID запишется в инстанс датчика
  * 

+ 1 - 0
unitemp.c

@@ -15,6 +15,7 @@
 //TODO: Обновлять данные только с тех датчиков, которые присутствуют на экране
 //TODO: Исправить сканирование one wire существующего датчика
 //TODO: В меню выбора нового датчика добавить помогалку выбора датчика
+//TODO: В режиме ожидания датчика указать в какому пину цепляться
 
 /* Переменные */
 //Данные приложения

+ 0 - 1
unitemp.h

@@ -9,7 +9,6 @@
 //Экран
 #include <gui/gui.h>
 #include <gui/view_dispatcher.h>
-#include <gui/modules/widget.h>
 //Уведомления
 #include <notification/notification.h>
 #include <notification/notification_messages.h>

+ 130 - 41
views/General_view.c

@@ -2,13 +2,10 @@
 #include "unitemp_icons.h"
 
 #include <assets_icons.h>
-static View* view;
 
-static uint8_t sensor_index = 0;
-static bool selector = false;
-static uint32_t lastSelectTime = 0;
-static const uint16_t selector_timeout = 2000;
-static char buff[7];
+#define BUFF_SIZE 17
+
+static View* view;
 
 typedef enum general_views {
     G_NO_SENSORS_VIEW, //Нет датчиков
@@ -16,6 +13,20 @@ typedef enum general_views {
     G_CAROUSEL_VIEW, //Карусель
 } general_view;
 
+typedef enum carousel_info {
+    CAROUSEL_VALUES, //Отображение значений датчиков
+    CAROUSEL_INFO, //Отображение информации о датчике
+} carousel_info;
+
+static uint8_t sensor_index = 0;
+static bool selector = false;
+static uint32_t lastSelectTime = 0;
+static const uint16_t selector_timeout = 2000;
+
+static carousel_info carousel_info_selector = CAROUSEL_VALUES;
+
+static char* buff;
+
 static general_view current_view;
 
 static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t y, Color color) {
@@ -37,10 +48,10 @@ static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t
         canvas, x + 3, y + 3, (app->settings.unit == CELSIUS ? &I_temp_C_11x14 : &I_temp_F_11x14));
 
     if((int16_t)sensor->temp == -128 || sensor->status == UT_TIMEOUT) {
-        snprintf(buff, 5, "--");
+        snprintf(buff, BUFF_SIZE, "--");
         canvas_set_font(canvas, FontBigNumbers);
         canvas_draw_str_aligned(canvas, x + 27, y + 10, AlignCenter, AlignCenter, buff);
-        snprintf(buff, 4, ". -");
+        snprintf(buff, BUFF_SIZE, ". -");
         canvas_set_font(canvas, FontPrimary);
         canvas_draw_str_aligned(canvas, x + 50, y + 10 + 3, AlignRight, AlignCenter, buff);
         if(color == ColorBlack) canvas_invert_color(canvas);
@@ -48,14 +59,14 @@ static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t
     }
 
     //Целая часть температуры
-    snprintf(buff, 7, "%d", temp_int);
+    snprintf(buff, BUFF_SIZE, "%d", temp_int);
     canvas_set_font(canvas, FontBigNumbers);
     canvas_draw_str_aligned(
         canvas, x + 27 + ((temp_int <= -10) ? 5 : 0), y + 10, AlignCenter, AlignCenter, buff);
     //Печать дробной части температуры в диапазоне от -9 до 99 (когда два знака в числе)
     if(temp_int > -10 && temp_int <= 99) {
         uint8_t int_len = canvas_string_width(canvas, buff);
-        snprintf(buff, 4, ".%d", temp_dec);
+        snprintf(buff, BUFF_SIZE, ".%d", temp_dec);
         canvas_set_font(canvas, FontPrimary);
         canvas_draw_str(canvas, x + 27 + int_len / 2 + 2, y + 10 + 7, buff);
     }
@@ -71,10 +82,10 @@ static void _draw_humidity(Canvas* canvas, Sensor* sensor, const uint8_t pos[2])
     canvas_draw_icon(canvas, pos[0] + 3, pos[1] + 2, &I_hum_9x15);
 
     if((int8_t)sensor->hum == -128 || sensor->status == UT_TIMEOUT) {
-        snprintf(buff, 5, "--");
+        snprintf(buff, BUFF_SIZE, "--");
         canvas_set_font(canvas, FontBigNumbers);
         canvas_draw_str_aligned(canvas, pos[0] + 27, pos[1] + 10, AlignCenter, AlignCenter, buff);
-        snprintf(buff, 4, ". -");
+        snprintf(buff, BUFF_SIZE, ". -");
         canvas_set_font(canvas, FontPrimary);
         canvas_draw_str_aligned(
             canvas, pos[0] + 50, pos[1] + 10 + 3, AlignRight, AlignCenter, buff);
@@ -82,7 +93,7 @@ static void _draw_humidity(Canvas* canvas, Sensor* sensor, const uint8_t pos[2])
     }
 
     //Целая часть влажности
-    snprintf(buff, 5, "%d", (uint8_t)sensor->hum);
+    snprintf(buff, BUFF_SIZE, "%d", (uint8_t)sensor->hum);
     canvas_set_font(canvas, FontBigNumbers);
     canvas_draw_str_aligned(canvas, pos[0] + 27, pos[1] + 10, AlignCenter, AlignCenter, buff);
     uint8_t int_len = canvas_string_width(canvas, buff);
@@ -101,7 +112,7 @@ static void _draw_pressure(Canvas* canvas, Sensor* sensor) {
     canvas_draw_icon(canvas, x + 3, y + 4, &I_pressure_7x13);
 
     //Давление
-    snprintf(buff, 6, "%d", (uint16_t)sensor->pressure);
+    snprintf(buff, BUFF_SIZE, "%d", (uint16_t)sensor->pressure);
     canvas_set_font(canvas, FontBigNumbers);
     canvas_draw_str_aligned(canvas, x + 30, y + 10, AlignCenter, AlignCenter, buff);
     //Единица измерения
@@ -131,7 +142,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, BUFF_SIZE, 17, &I_sherlok_53x55);
     //Рисование рамки
     canvas_draw_rframe(canvas, 0, 0, 128, 63, 7);
     canvas_draw_rframe(canvas, 0, 0, 128, 64, 7);
@@ -195,36 +206,15 @@ static void _draw_view_sensorsList(Canvas* canvas) {
     }
 }
 
-static void _draw_view_sensorsCarousel(Canvas* canvas) {
-    static const uint8_t temp_positions[3][2] = {{37, 23}, {37, 16}, {9, 16}};
-    static const uint8_t hum_positions[2][2] = {{37, 38}, {65, 16}};
-    //Рисование рамки
-    canvas_draw_rframe(canvas, 3, 0, 122, 63, 7);
-    canvas_draw_rframe(canvas, 3, 0, 122, 64, 7);
-
-    //Печать имени
-    canvas_set_font(canvas, FontPrimary);
-    canvas_draw_str_aligned(
-        canvas, 64, 7, AlignCenter, AlignCenter, app->sensors[sensor_index]->name);
-    //Подчёркивание
-    uint8_t line_len = canvas_string_width(canvas, app->sensors[sensor_index]->name) + 2;
-    canvas_draw_line(canvas, 64 - line_len / 2, 12, 64 + line_len / 2, 12);
-
-    //Стрелка вправо
-    if(unitemp_sensors_getTypesCount() > 0 && sensor_index < unitemp_sensors_getCount() - 1) {
-        canvas_draw_icon(canvas, 117, 28, &I_arrow_right_5x9);
-    }
-    //Стрелка влево
-    if(sensor_index > 0) {
-        canvas_draw_icon(canvas, 6, 28, &I_arrow_left_5x9);
-    }
-
+static void _draw_carousel_values(Canvas* canvas) {
     if(app->sensors[sensor_index]->status == UT_TIMEOUT) {
         const Icon* frames[] = {&I_happy_2_78x46, &I_happy_78x46, &I_sad_78x46};
         canvas_draw_icon(canvas, 24, 15, frames[furi_get_tick() % 2250 / 750]);
         return;
     }
 
+    static const uint8_t temp_positions[3][2] = {{37, 23}, {37, 16}, {9, 16}};
+    static const uint8_t hum_positions[2][2] = {{37, 38}, {65, 16}};
     //Селектор значений для отображения
     switch(app->sensors[sensor_index]->type->datatype) {
     case UT_DATA_TYPE_TEMP:
@@ -265,6 +255,90 @@ static void _draw_view_sensorsCarousel(Canvas* canvas) {
         break;
     }
 }
+static void _draw_carousel_info(Canvas* canvas) {
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str(canvas, 10, 23, "Type:");
+
+    if(app->sensors[sensor_index]->type->interface == &ONE_WIRE) {
+        OneWireSensor* s = app->sensors[sensor_index]->instance;
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 10, 35, "GPIO:");
+        canvas_draw_str(canvas, 10, 47, "ID:");
+
+        canvas_set_font(canvas, FontSecondary);
+        canvas_draw_str(
+            canvas, 41, 23, unitemp_onewire_sensor_getModel(app->sensors[sensor_index]));
+        canvas_draw_str(canvas, 41, 35, s->bus->gpio->name);
+        snprintf(
+            buff,
+            BUFF_SIZE,
+            "%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]);
+        canvas_draw_str(canvas, 24, 47, buff);
+    }
+
+    if(app->sensors[sensor_index]->type->interface == &SINGLE_WIRE) {
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 10, 35, "GPIO:");
+
+        canvas_set_font(canvas, FontSecondary);
+        canvas_draw_str(canvas, 41, 23, app->sensors[sensor_index]->type->typename);
+        canvas_draw_str(
+            canvas, 41, 35, ((SingleWireSensor*)app->sensors[sensor_index]->instance)->gpio->name);
+    }
+
+    if(app->sensors[sensor_index]->type->interface == &I2C) {
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 10, 35, "I2C addr:");
+
+        canvas_set_font(canvas, FontSecondary);
+        canvas_draw_str(canvas, 41, 23, app->sensors[sensor_index]->type->typename);
+        snprintf(
+            buff,
+            BUFF_SIZE,
+            "0x%02X",
+            ((I2CSensor*)app->sensors[sensor_index]->instance)->currentI2CAdr);
+        canvas_draw_str(canvas, 57, 35, buff);
+    }
+}
+static void _draw_view_sensorsCarousel(Canvas* canvas) {
+    //Рисование рамки
+    canvas_draw_rframe(canvas, 0, 0, 128, 63, 7);
+    canvas_draw_rframe(canvas, 0, 0, 128, 64, 7);
+
+    //Печать имени
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 64, 7, AlignCenter, AlignCenter, app->sensors[sensor_index]->name);
+    //Подчёркивание
+    uint8_t line_len = canvas_string_width(canvas, app->sensors[sensor_index]->name) + 2;
+    canvas_draw_line(canvas, 64 - line_len / 2, 12, 64 + line_len / 2, 12);
+
+    //Стрелка вправо
+    if(unitemp_sensors_getTypesCount() > 0 && sensor_index < unitemp_sensors_getCount() - 1) {
+        canvas_draw_icon(canvas, 120, 28, &I_arrow_right_5x9);
+    }
+    //Стрелка влево
+    if(sensor_index > 0) {
+        canvas_draw_icon(canvas, 3, 28, &I_arrow_left_5x9);
+    }
+
+    switch(carousel_info_selector) {
+    case CAROUSEL_VALUES:
+        _draw_carousel_values(canvas);
+        break;
+    case CAROUSEL_INFO:
+        _draw_carousel_info(canvas);
+        break;
+    }
+}
 
 static void _draw_callback(Canvas* canvas, void* _model) {
     UNUSED(_model);
@@ -314,6 +388,9 @@ static bool _input_callback(InputEvent* event, void* context) {
             if(selector) sensor_index++;
             if(sensor_index >= unitemp_sensors_getCount()) sensor_index = 0;
         }
+        if(current_view == G_CAROUSEL_VIEW) {
+            carousel_info_selector = !carousel_info_selector;
+        }
     }
     //Обработка короткого нажатия "вверх"
     if(event->key == InputKeyUp && event->type == InputTypeShort) {
@@ -324,22 +401,31 @@ static bool _input_callback(InputEvent* event, void* context) {
             if(sensor_index >= unitemp_sensors_getCount())
                 sensor_index = unitemp_sensors_getCount() - 1;
         }
+        if(current_view == G_CAROUSEL_VIEW) {
+            carousel_info_selector = !carousel_info_selector;
+        }
     }
 
     //Обработка короткого нажатия "вправо"
     if(event->key == InputKeyRight && event->type == InputTypeShort) {
         //Пролистывание карусели вперёд
         if(current_view == G_CAROUSEL_VIEW) {
+            carousel_info_selector = CAROUSEL_VALUES;
             if(++sensor_index >= unitemp_sensors_getCount()) sensor_index = 0;
         }
+        //Переход в карусель
+        if(current_view == G_LIST_VIEW) current_view = G_CAROUSEL_VIEW;
     }
     //Обработка короткого нажатия "влево"
     if(event->key == InputKeyLeft && event->type == InputTypeShort) {
         //Пролистывание карусели назад
         if(current_view == G_CAROUSEL_VIEW) {
+            carousel_info_selector = CAROUSEL_VALUES;
             if(--sensor_index >= unitemp_sensors_getCount())
                 sensor_index = unitemp_sensors_getCount() - 1;
         }
+        //Переход в карусель
+        if(current_view == G_LIST_VIEW) current_view = G_CAROUSEL_VIEW;
     }
 
     //Обработка короткого нажатия "назад"
@@ -359,14 +445,17 @@ void unitemp_General_alloc(void) {
     view_set_draw_callback(view, _draw_callback);
     view_set_input_callback(view, _input_callback);
 
-    view_dispatcher_add_view(app->view_dispatcher, GENERAL_VIEW, view);
+    view_dispatcher_add_view(app->view_dispatcher, VIEW_GENERAL, view);
+
+    buff = malloc(10);
 }
 
 void unitemp_General_switch(void) {
     app->sensors_ready = true;
-    view_dispatcher_switch_to_view(app->view_dispatcher, GENERAL_VIEW);
+    view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_GENERAL);
 }
 
 void unitemp_General_free(void) {
     view_free(view);
+    free(buff);
 }

+ 2 - 2
views/MainMenu_view.c

@@ -6,7 +6,7 @@ static View* view;
 //Список
 static VariableItemList* variable_item_list;
 
-#define VIEW_ID MAINMENU_VIEW
+#define VIEW_ID VIEW_MAIN_MENU
 
 /**
  * @brief Функция обработки нажатия кнопки "Назад"
@@ -17,7 +17,7 @@ static VariableItemList* variable_item_list;
 static uint32_t _exit_callback(void* context) {
     UNUSED(context);
     //Возврат в общий вид
-    return GENERAL_VIEW;
+    return VIEW_GENERAL;
 }
 /**
  * @brief Функция обработки нажатия средней кнопки

+ 3 - 4
views/SensorActions_view.c

@@ -9,7 +9,7 @@ static VariableItemList* variable_item_list;
 //Текущий датчик
 static Sensor* current_sensor;
 
-#define VIEW_ID SENSORACTIONS_VIEW
+#define VIEW_ID VIEW_SENSOR_ACTIONS
 
 /**
  * @brief Функция обработки нажатия кнопки "Назад"
@@ -21,7 +21,7 @@ static uint32_t _exit_callback(void* context) {
     UNUSED(context);
 
     //Возврат предыдущий вид
-    return GENERAL_VIEW;
+    return VIEW_GENERAL;
 }
 /**
  * @brief Функция обработки нажатия средней кнопки
@@ -32,7 +32,7 @@ static uint32_t _exit_callback(void* context) {
 static void _enter_callback(void* context, uint32_t index) {
     UNUSED(context);
     switch(index) {
-    case 1:
+    case 0:
         unitemp_SensorEdit_switch(current_sensor);
         break;
     }
@@ -46,7 +46,6 @@ void unitemp_SensorActions_alloc(void) {
     //Сброс всех элементов меню
     variable_item_list_reset(variable_item_list);
 
-    variable_item_list_add(variable_item_list, "Info", 1, NULL, NULL);
     variable_item_list_add(variable_item_list, "Edit", 1, NULL, NULL);
     variable_item_list_add(variable_item_list, "Delete", 1, NULL, NULL);
 

+ 4 - 15
views/SensorEdit_view.c

@@ -21,7 +21,7 @@ static VariableItem* onewire_addr_item;
 //Элемент списка - адрес датчика one wire
 static VariableItem* onewire_type_item;
 
-#define VIEW_ID SENSOREDIT_VIEW
+#define VIEW_ID VIEW_SENSOR_EDIT
 
 bool _onewire_id_exist(uint8_t* id) {
     if(id == NULL) return false;
@@ -96,19 +96,8 @@ static void _onewire_scan(void) {
             ow_sensor->deviceID[3]);
         //А больше не лезет(
         variable_item_set_current_value_text(onewire_addr_item, id_buff);
-        switch(ow_sensor->deviceID[0]) {
-        case FC_DS18B20:
-            variable_item_set_current_value_text(onewire_type_item, "DS18B20");
-            break;
-        case FC_DS18S20:
-            variable_item_set_current_value_text(onewire_type_item, "DS18S20");
-            break;
-        case FC_DS1822:
-            variable_item_set_current_value_text(onewire_type_item, "DS1822");
-            break;
-        default:
-            variable_item_set_current_value_text(onewire_type_item, "unknown");
-        }
+        variable_item_set_current_value_text(
+            onewire_type_item, unitemp_onewire_sensor_getModel(editable_sensor));
     } else {
         variable_item_set_current_value_text(onewire_addr_item, "empty");
         variable_item_set_current_value_text(onewire_type_item, editable_sensor->type->typename);
@@ -126,7 +115,7 @@ static uint32_t _exit_callback(void* context) {
 
     if(!unitemp_sensor_isContains(editable_sensor)) unitemp_sensor_free(editable_sensor);
     //Возврат предыдущий вид
-    return GENERAL_VIEW;
+    return VIEW_GENERAL;
 }
 /**
  * @brief Функция обработки нажатия средней кнопки

+ 1 - 1
views/SensorNameEdit_view.c

@@ -6,7 +6,7 @@ static TextInput* text_input;
 //Текущий редактируемый датчик
 static Sensor* editable_sensor;
 
-#define VIEW_ID SENSORNAMEEDIT_VIEW
+#define VIEW_ID VIEW_SENSOR_NAME_EDIT
 
 static void _sensor_name_changed_callback(void* context) {
     UNUSED(context);

+ 2 - 2
views/SensorsList_view.c

@@ -7,7 +7,7 @@ static View* view;
 //Список
 static VariableItemList* variable_item_list;
 
-#define VIEW_ID SENSORSLIST_VIEW
+#define VIEW_ID VIEW_SENSORS_LIST
 
 /**
  * @brief Функция обработки нажатия кнопки "Назад"
@@ -19,7 +19,7 @@ static uint32_t _exit_callback(void* context) {
     UNUSED(context);
 
     //Возврат предыдущий вид
-    return MAINMENU_VIEW;
+    return VIEW_MAIN_MENU;
 }
 /**
  * @brief Функция обработки нажатия средней кнопки

+ 2 - 2
views/Settings_view.c

@@ -13,7 +13,7 @@ static const char units[2][3] = {"*C", "*F"};
 VariableItem* infinity_backlight_item;
 //Единица измерения температуры
 VariableItem* temperature_unit_item;
-#define VIEW_ID SETTINGS_VIEW
+#define VIEW_ID VIEW_SETTINGS
 
 /**
  * @brief Функция обработки нажатия кнопки "Назад"
@@ -40,7 +40,7 @@ static uint32_t _exit_callback(void* context) {
     unitemp_loadSettings();
 
     //Возврат предыдущий вид
-    return MAINMENU_VIEW;
+    return VIEW_MAIN_MENU;
 }
 /**
  * @brief Функция обработки нажатия средней кнопки

+ 9 - 7
views/UnitempViews.h

@@ -5,13 +5,14 @@
 
 //Виды менюшек
 typedef enum UnitempViews {
-    GENERAL_VIEW,
-    MAINMENU_VIEW,
-    SETTINGS_VIEW,
-    SENSORSLIST_VIEW,
-    SENSOREDIT_VIEW,
-    SENSORNAMEEDIT_VIEW,
-    SENSORACTIONS_VIEW,
+    VIEW_GENERAL,
+    VIEW_MAIN_MENU,
+    VIEW_SETTINGS,
+    VIEW_SENSORS_LIST,
+    VIEW_SENSOR_EDIT,
+    VIEW_SENSOR_NAME_EDIT,
+    VIEW_SENSOR_ACTIONS,
+    VIEW_SENSOR_INFO,
 
     VIEWS_COUNT
 } UnitempViews;
@@ -51,4 +52,5 @@ void unitemp_SensorNameEdit_free(void);
 void unitemp_SensorActions_alloc(void);
 void unitemp_SensorActions_switch(Sensor* sensor);
 void unitemp_SensorActions_free(void);
+
 #endif