Procházet zdrojové kódy

Work has begun on the GUI. Fixed a bug with highlighting. Minor fixes

Victor před 3 roky
rodič
revize
60ef9677f7
7 změnil soubory, kde provedl 130 přidání a 28 odebrání
  1. 2 0
      interfaces/OneWire.c
  2. 19 14
      interfaces/Sensors.c
  3. 7 0
      interfaces/Sensors.h
  4. 21 0
      scenes/Scenes.h
  5. 49 0
      scenes/TempHum_scene.c
  6. 22 13
      unitemp.c
  7. 10 1
      unitemp.h

+ 2 - 0
interfaces/OneWire.c

@@ -48,6 +48,8 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
     OneWireSensor* instance = sensor->instance;
     //Проверка на допустимость опроса датчика
     if(furi_get_tick() - instance->lastPollingTime < POLLING_INTERVAL) {
+        //Возврат ошибки если последний опрос датчика был неудачным
+        if(sensor->hum == -128.0f && sensor->temp == -128.0f) return UT_TIMEOUT;
         //Выход в случае раннего опроса
         return UT_EARLYPOOL;
     }

+ 19 - 14
interfaces/Sensors.c

@@ -158,17 +158,7 @@ bool unitemp_sensors_load() {
     file_stream_close(app->file_stream);
     stream_free(app->file_stream);
 
-    //Применение настроек
-    if(app->settings.infinityBacklight) {
-        //Постоянное свечение подсветки
-        notification_message(app->notifications, &sequence_display_backlight_enforce_on);
-    } else {
-        //Автоматическое управление
-        notification_message(app->notifications, &sequence_display_backlight_enforce_auto);
-    }
-    app->settings.lastOTGState = furi_hal_power_is_otg_enabled();
-
-    FURI_LOG_I(APP_NAME, "Settings have been successfully loaded");
+    FURI_LOG_I(APP_NAME, "Sensors have been successfully loaded");
     return true;
 }
 
@@ -224,6 +214,8 @@ Sensor* unitemp_sensor_alloc(char* name, SensorType st) {
     if(sensor == NULL) return false;
     sensor->name = malloc(11);
     strcpy(sensor->name, name);
+    sensor->status = UT_ERROR;
+
     //Выделение памяти под инстанс датчиков One Wire
     if(st == DHT11 || st == DHT12_1W || st == DHT21 || st == DHT22 || st == AM2320_1W) {
         OneWireSensor* instance = malloc(sizeof(OneWireSensor));
@@ -281,8 +273,21 @@ bool unitemp_sensors_deInit(void) {
 UnitempStatus unitemp_sensor_getValues(Sensor* sensor) {
     if(sensor == NULL) return UT_ERROR;
 
+    if(!furi_hal_power_is_otg_enabled()) {
+        furi_hal_power_enable_otg();
+    }
+
     if(sensor->interface == ONE_WIRE) {
-        return unitemp_oneWire_getData(sensor);
+        sensor->status = unitemp_oneWire_getData(sensor);
+        return sensor->status;
     }
-    return UT_ERROR;
-}
+
+    sensor->status = UT_ERROR;
+    return sensor->status;
+}
+
+void unitemp_sensors_updateValues(void) {
+    for(size_t i = 0; i < app->sensors_count; i++) {
+        unitemp_sensor_getValues(app->sensors[i]);
+    }
+}

+ 7 - 0
interfaces/Sensors.h

@@ -62,6 +62,8 @@ typedef struct Sensor {
     SensorType type;
     //Интерфейсы подключения
     Interface interface;
+    //Статус последнего опроса датчика
+    UnitempStatus status;
     //Экземпляр датчика
     void* instance;
 } Sensor;
@@ -135,4 +137,9 @@ bool unitemp_sensors_load();
  */
 bool unitemp_sensors_save(void);
 
+/**
+ * @brief Обновить данные со всех датчиков
+ */
+void unitemp_sensors_updateValues(void);
+
 #endif

+ 21 - 0
scenes/Scenes.h

@@ -0,0 +1,21 @@
+#ifndef UNITEMP_SCENES
+#define UNITEMP_SCENES
+
+#include "../unitemp.h"
+
+//Виды менюшек
+typedef enum UnitempViews {
+    TEMPHUM_VIEW,
+} UnitempViews;
+
+/**
+ * @brief Создание сцены отображения данных температуры и влажности
+ */
+void TempHum_secene_alloc(void);
+
+/**
+ * @brief //Освобождение памяти сцены
+ */
+void TempHum_secene_free(void);
+
+#endif

+ 49 - 0
scenes/TempHum_scene.c

@@ -0,0 +1,49 @@
+#include "Scenes.h"
+
+static View* view;
+
+static void TempHum_draw_callback(Canvas* canvas, void* _model) {
+    UNUSED(_model);
+
+    //Рисование бара
+    canvas_draw_box(canvas, 0, 0, 128, 14);
+    canvas_set_color(canvas, ColorWhite);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(canvas, 64, 7, AlignCenter, AlignCenter, "Unitemp");
+
+    canvas_set_color(canvas, ColorBlack);
+    if(app->sensors_count > 0) {
+        for(uint8_t i = 0; i < app->sensors_count; i++) {
+            canvas_set_font(canvas, FontPrimary);
+            canvas_draw_str(canvas, 0, 24 + 10 * i, app->sensors[i]->name);
+
+            canvas_set_font(canvas, FontSecondary);
+            if(app->sensors[i]->status != UT_OK && app->sensors[i]->status != UT_EARLYPOOL) {
+                canvas_draw_str(canvas, 96, 24 + 10 * i, "timeout");
+            } else {
+                char buff[20];
+                snprintf(
+                    buff,
+                    sizeof(buff),
+                    "%2.1f*C/%d%%",
+                    (double)app->sensors[i]->temp,
+                    (int8_t)app->sensors[i]->hum);
+                canvas_draw_str(canvas, 64, 24 + 10 * i, buff);
+            }
+        }
+    } else {
+        canvas_set_font(canvas, FontSecondary);
+        if(app->sensors_count == 0) canvas_draw_str(canvas, 0, 24, "Sensors not found");
+    }
+}
+void TempHum_secene_alloc(void) {
+    view = view_alloc();
+    view_set_context(view, app);
+    view_set_draw_callback(view, TempHum_draw_callback);
+
+    view_dispatcher_add_view(app->view_dispatcher, TEMPHUM_VIEW, view);
+}
+
+void TempHum_secene_free(void) {
+    view_free(view);
+}

+ 22 - 13
unitemp.c

@@ -1,6 +1,7 @@
 #include "unitemp.h"
 #include "interfaces/OneWire.h"
 #include "interfaces/Sensors.h"
+#include "scenes/Scenes.h"
 
 #include <furi_hal_power.h>
 
@@ -180,6 +181,7 @@ static bool unitemp_loadSettings(void) {
 static bool unitemp_alloc(void) {
     //Выделение памяти под данные приложения
     app = malloc(sizeof(Unitemp));
+    app->processing = true;
     //Открытие хранилища (?)
     app->storage = furi_record_open(RECORD_STORAGE);
 
@@ -189,6 +191,16 @@ static bool unitemp_alloc(void) {
     //Установка значений по умолчанию
     app->settings.infinityBacklight = true; //Подсветка горит всегда
     app->settings.unit = CELSIUM; //Единица измерения - градусы Цельсия
+
+    app->gui = furi_record_open(RECORD_GUI);
+    //Диспетчер окон
+    app->view_dispatcher = view_dispatcher_alloc();
+
+    TempHum_secene_alloc();
+
+    view_dispatcher_enable_queue(app->view_dispatcher);
+    view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
+
     return true;
 }
 
@@ -196,6 +208,13 @@ static bool unitemp_alloc(void) {
  * @brief Освыбождение памяти после работы приложения
  */
 static void unitemp_free(void) {
+    //Автоматическое управление подсветкой
+    notification_message(app->notifications, &sequence_display_backlight_enforce_auto);
+
+    TempHum_secene_free();
+
+    view_dispatcher_free(app->view_dispatcher);
+    furi_record_close(RECORD_GUI);
     //Очистка датчиков
     for(size_t i = 0; i < app->sensors_count; i++) {
         free(app->sensors[i]);
@@ -231,20 +250,10 @@ int32_t unitemp_app() {
     //Инициализация датчиков
     unitemp_sensors_init();
 
-    uint32_t startTime = furi_get_tick();
-    while(furi_get_tick() - startTime < 10000) {
-        FURI_LOG_D(APP_NAME, "Sensors values:");
-        for(uint8_t i = 0; i < app->sensors_count; i++) {
-            UnitempStatus s = unitemp_sensor_getValues(app->sensors[i]);
-            FURI_LOG_D(
-                APP_NAME,
-                "%s (%d): %2.1f*C/%d%%",
-                app->sensors[i]->name,
-                s,
-                (double)app->sensors[i]->temp,
-                (uint8_t)app->sensors[i]->hum);
-        }
+    view_dispatcher_switch_to_view(app->view_dispatcher, TEMPHUM_VIEW);
 
+    while(app->processing) {
+        unitemp_sensors_updateValues();
         furi_delay_ms(1000);
     }
 

+ 10 - 1
unitemp.h

@@ -6,6 +6,11 @@
 /* Подключение API Flipper Zero */
 //Файловый поток
 #include <toolbox/stream/file_stream.h>
+//Экран
+#include <gui/gui.h>
+#include <gui/view_dispatcher.h>
+#include <gui/modules/widget.h>
+
 //Уведомления
 #include <notification/notification.h>
 #include <notification/notification_messages.h>
@@ -44,6 +49,8 @@ typedef struct {
 
 //Основная структура плагина
 typedef struct {
+    bool processing;
+
     //Основные настройки
     UnitempSettings settings;
     //Список указателей на датчики
@@ -55,7 +62,9 @@ typedef struct {
     Storage* storage; //Хранилище
     Stream* file_stream; //Файловый поток
 
-    //Уведомления
+    //Экран
+    Gui* gui;
+    ViewDispatcher* view_dispatcher;
     NotificationApp* notifications;
 } Unitemp;