Bläddra i källkod

The number of sensors is not limited

Виктор Никитчук 3 år sedan
förälder
incheckning
adcc0df3ef
8 ändrade filer med 46 tillägg och 21 borttagningar
  1. 23 9
      Sensors.c
  2. 12 1
      Sensors.h
  3. 1 1
      interfaces/OneWireSensor.c
  4. 3 0
      unitemp.c
  5. 2 3
      unitemp.h
  6. 0 2
      views/MainMenu_view.c
  7. 2 2
      views/SensorEdit_view.c
  8. 3 3
      views/Summary_view.c

+ 23 - 9
Sensors.c

@@ -190,10 +190,23 @@ const GPIO* unitemp_gpio_getAviablePort(const Interface* interface, uint8_t inde
     return NULL;
 }
 
+uint8_t unitemp_sensors_getCount(void) {
+    if(app->sensors == NULL) return 0;
+    return app->sensors_count;
+}
+
+void unitemp_sensors_add(Sensor* sensor) {
+    FURI_LOG_D(APP_NAME, "realloc to %d", unitemp_sensors_getCount() + 1);
+    app->sensors =
+        (Sensor**)realloc(app->sensors, (unitemp_sensors_getCount() + 1) * sizeof(Sensor*));
+    FURI_LOG_D(APP_NAME, "adding to %d", unitemp_sensors_getCount());
+    app->sensors[unitemp_sensors_getCount()] = sensor;
+    app->sensors_count++;
+}
+
 bool unitemp_sensors_load(void) {
     FURI_LOG_D(APP_NAME, "Loading sensors...");
-    app->sensors_count = 0;
-    memset(app->sensors, 0, sizeof(app->sensors));
+    //memset(app->sensors, 0, (unitemp_sensors_getCount() + 1) * sizeof(Sensor*));
 
     //Выделение памяти на поток
     app->file_stream = file_stream_alloc(app->storage);
@@ -270,12 +283,13 @@ bool unitemp_sensors_load(void) {
 
         char* args = ((char*)(file_buf + line_end + offset));
         const SensorType* stype = unitemp_sensors_getTypeFromStr(type);
+
         //Проверка типа датчика
         if(stype != NULL && sizeof(name) > 0 && sizeof(name) <= 11) {
             Sensor* sensor =
                 unitemp_sensor_alloc(name, unitemp_sensors_getTypeFromStr(type), args);
             if(sensor != NULL) {
-                app->sensors[app->sensors_count++] = sensor;
+                unitemp_sensors_add(sensor);
             } else {
                 FURI_LOG_E(APP_NAME, "Failed sensor (%s:%s) mem allocation", name, type);
             }
@@ -320,7 +334,7 @@ bool unitemp_sensors_save(void) {
     }
 
     //Сохранение датчиков
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(app->sensors[i]->type->interface == &SINGLE_WIRE) {
             stream_write_format(
                 app->file_stream,
@@ -404,6 +418,7 @@ Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, char* args) {
 
     //Выход если датчик успешно развёрнут
     if(status) {
+        FURI_LOG_I(APP_NAME, "Sensor %s allocated", name);
         return sensor;
     }
     //Если ни один из типов не подошёл, то выход с очисткой
@@ -440,18 +455,17 @@ void unitemp_sensor_free(Sensor* sensor) {
 }
 
 void unitemp_sensors_free(void) {
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         unitemp_sensor_free(app->sensors[i]);
     }
     app->sensors_count = 0;
-    free(app->sensors);
 }
 
 bool unitemp_sensors_init(void) {
     bool result = true;
 
     //Перебор датчиков из списка
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         //Включение 5V если на порту 1 FZ его нет
         //Может пропасть при отключении USB
         if(furi_hal_power_is_otg_enabled() != true) {
@@ -480,7 +494,7 @@ bool unitemp_sensors_deInit(void) {
     }
 
     //Перебор датчиков из списка
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(!(*app->sensors[i]->type->deinitializer)(app->sensors[i])) {
             FURI_LOG_E(
                 APP_NAME,
@@ -519,7 +533,7 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) {
 }
 
 void unitemp_sensors_updateValues(void) {
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         unitemp_sensor_updateData(app->sensors[i]);
     }
 }

+ 12 - 1
Sensors.h

@@ -83,7 +83,6 @@ typedef struct Sensor {
     float temp;
     //Относительная влажность
     float hum;
-
     //Тип датчика
     const SensorType* type;
     //Статус последнего опроса датчика
@@ -162,6 +161,18 @@ void unitemp_sensors_free(void);
  */
 void unitemp_sensors_updateValues(void);
 
+/**
+ * @brief Получить количество загруженных датчиков
+ * @return Количество датчиков
+ */
+uint8_t unitemp_sensors_getCount(void);
+
+/**
+ * @brief Добавить датчик в общий список
+ * @param sensor Указатель на датчик
+ */
+void unitemp_sensors_add(Sensor* sensor);
+
 /**
 * @brief Получить списк доступных типов датчиков
 * @return Указатель на список датчиков

+ 1 - 1
interfaces/OneWireSensor.c

@@ -27,7 +27,7 @@ OneWireBus* uintemp_onewire_bus_alloc(const GPIO* gpio) {
     }
 
     //Проверка на наличие шины на этом порте
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(app->sensors[i]->type->interface == &ONE_WIRE &&
            ((OneWireSensor*)app->sensors[i]->instance)->bus->gpio->num == gpio->num) {
             //Если шина на этом порту уже есть, то возврат указателя на шину

+ 3 - 0
unitemp.c

@@ -183,6 +183,8 @@ static bool unitemp_alloc(void) {
     //Диспетчер окон
     app->view_dispatcher = view_dispatcher_alloc();
 
+    app->sensors = NULL;
+
     unitemp_Summary_alloc();
     unitemp_MainMenu_alloc();
     unitemp_Settings_alloc();
@@ -211,6 +213,7 @@ static void unitemp_free(void) {
     //Очистка датчиков
     //Высвыбождение данных датчиков
     unitemp_sensors_free();
+    free(app->sensors);
 
     //Закрытие уведомлений
     furi_record_close(RECORD_NOTIFICATION);

+ 2 - 3
unitemp.h

@@ -52,11 +52,10 @@ typedef struct {
     bool sensors_ready; //Флаг готовности датчиков к опросу
     //Основные настройки
     UnitempSettings settings;
-    //Список указателей на датчики
-    Sensor* sensors[MAX_SENSORS];
+    //Массив указателей на датчики
+    Sensor** sensors;
     //Количество загруженных датчиков
     uint8_t sensors_count;
-
     //SD-карта
     Storage* storage; //Хранилище
     Stream* file_stream; //Файловый поток

+ 0 - 2
views/MainMenu_view.c

@@ -28,8 +28,6 @@ static uint32_t _exit_callback(void* context) {
 static void _enter_callback(void* context, uint32_t index) {
     UNUSED(context);
     if(index == 0) { //add new sensor
-        //TODO: сообщение о максимальном количестве датчиков
-        if(app->sensors_count >= MAX_SENSORS) return;
         unitemp_SensorsList_switch();
     }
     if(index == 1) { //Settings

+ 2 - 2
views/SensorEdit_view.c

@@ -23,7 +23,7 @@ static VariableItem* onewire_type_item;
 
 bool _onewire_id_exist(uint8_t* id) {
     if(id == NULL) return false;
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(app->sensors[i]->type == &DS18x2x) {
             if(unitemp_onewire_id_compare(
                    id, ((OneWireSensor*)(app->sensors[i]->instance))->deviceID)) {
@@ -145,7 +145,7 @@ static void _enter_callback(void* context, uint32_t index) {
            ((OneWireSensor*)(editable_sensor->instance))->familyCode == 0) {
             return;
         }
-        app->sensors[app->sensors_count++] = editable_sensor;
+        unitemp_sensors_add(editable_sensor);
         unitemp_sensors_save();
         unitemp_sensors_reload();
 

+ 3 - 3
views/Summary_view.c

@@ -14,8 +14,8 @@ static void _draw_callback(Canvas* canvas, void* _model) {
     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++) {
+    if(unitemp_sensors_getCount() > 0) {
+        for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
             canvas_set_font(canvas, FontPrimary);
             canvas_draw_str(canvas, 0, 24 + 10 * i, app->sensors[i]->name);
 
@@ -41,7 +41,7 @@ static void _draw_callback(Canvas* canvas, void* _model) {
         }
     } else {
         canvas_set_font(canvas, FontSecondary);
-        if(app->sensors_count == 0) canvas_draw_str(canvas, 0, 24, "Sensors not found");
+        if(unitemp_sensors_getCount() == 0) canvas_draw_str(canvas, 0, 24, "Sensors not found");
     }
 }