Просмотр исходного кода

Fixed application crash on save

Victor 3 лет назад
Родитель
Сommit
d397f3e827
3 измененных файлов с 30 добавлено и 11 удалено
  1. 4 3
      Sensors.c
  2. 1 1
      unitemp.c
  3. 25 7
      views/SensorsList_view.c

+ 4 - 3
Sensors.c

@@ -323,9 +323,9 @@ bool unitemp_sensors_save(void) {
         if(app->sensors[i]->type->interface == &SINGLE_WIRE) {
             stream_write_format(
                 app->file_stream,
-                "%s %d %d\n",
+                "%s %s %d\n",
                 app->sensors[i]->name,
-                unitemp_getIntFromType(app->sensors[i]->type),
+                app->sensors[i]->type->typename,
                 unitemp_singlewire_sensorGetGPIO(app->sensors[i])->num);
         }
         if(app->sensors[i]->type->interface == &I2C) {
@@ -428,13 +428,14 @@ void unitemp_sensor_free(Sensor* sensor) {
     bool status = false;
     //Высвобождение памяти под инстанс
     status = sensor->type->interface->mem_releaser(sensor);
+
     if(status) {
         FURI_LOG_D(APP_NAME, "Sensor %s memory successfully released", sensor->name);
     } else {
         FURI_LOG_E(APP_NAME, "Sensor %s memory is not released", sensor->name);
     }
     free(sensor->name);
-    free(sensor);
+    //free(sensor);
 }
 
 void unitemp_sensors_free(void) {

+ 1 - 1
unitemp.c

@@ -7,11 +7,11 @@
 #include <m-string.h>
 
 //TODO: Реализовать ограничение на добавление датчиков если интерфейс недоступен
-//TODO: Исправить падения при добавлении и сохранении датчка
 //TODO: Исключить добавление датчиков DS18x2x с одинаковыми ID
 //TODO: Проверка корректности параметров датчика перед аллокацией
 //TODO: Не выкидывать датчик в ошибку при первом же неудачном опросе
 //TODO: Запускать преобразование DS18x2x разом, затем поочерёдно считывать
+//TODO: Запрет сохранения DS18x2x с пустым адресом
 
 /* Переменные */
 //Данные приложения

+ 25 - 7
views/SensorsList_view.c

@@ -32,15 +32,33 @@ static void _enter_callback(void* context, uint32_t index) {
     //Имя датчка
     char sensor_name[11];
     snprintf(sensor_name, 11, "Sensor%d", app->sensors_count + 1);
-    const SensorType* st = unitemp_sensors_getTypes()[index];
-    char args[1] = {0};
-    //Выбор первого доступного порта для датчиков single wire и one wire
-    if(st->interface == &SINGLE_WIRE || st->interface == &ONE_WIRE) {
-        args[0] = unitemp_gpio_toInt(unitemp_gpio_getAviablePort(st->interface, 0));
+    const SensorType* type = unitemp_sensors_getTypes()[index];
+
+    char args[22] = {0};
+    //Выбор первого доступного порта для датчика single wire
+    if(type->interface == &SINGLE_WIRE) {
+        snprintf(
+            args, 4, "%d", unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0)));
+    }
+    //Выбор первого доступного порта для датчика one wire и запись нулевого ID
+    if(type->interface == &ONE_WIRE) {
+        snprintf(
+            args,
+            21,
+            "%d %02X%02X%02X%02X%02X%02X%02X%02X",
+            unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0)),
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0);
     }
-    //Для I2C адрес выберится автоматически
+    //Для I2C адрес выберется автоматически
 
-    unitemp_SensorEdit_switch(unitemp_sensor_alloc(sensor_name, st, args));
+    unitemp_SensorEdit_switch(unitemp_sensor_alloc(sensor_name, type, args));
 }
 
 /**