Victor 3 лет назад
Родитель
Сommit
cd29b1386c
6 измененных файлов с 76 добавлено и 23 удалено
  1. 19 9
      Sensors.c
  2. 12 2
      Sensors.h
  3. 7 1
      views/General_view.c
  4. 6 2
      views/MainMenu_view.c
  5. 27 7
      views/SensorEdit_view.c
  6. 5 2
      views/SensorsList_view.c

+ 19 - 9
Sensors.c

@@ -121,20 +121,21 @@ uint8_t unitemp_gpio_to_index(const GpioPin* gpio) {
     return 255;
 }
 
-uint8_t unitemp_gpio_getAviablePortsCount(const Interface* interface) {
+uint8_t unitemp_gpio_getAviablePortsCount(const Interface* interface, const GPIO* extraport) {
     uint8_t aviable_ports_count = 0;
     for(uint8_t i = 0; i < GPIO_ITEMS; i++) {
         //Проверка для one wire
         if(interface == &ONE_WIRE) {
-            if((gpio_interfaces_list[i] == NULL || gpio_interfaces_list[i] == &ONE_WIRE) &&
-               i != 12) { //Почему-то не работает на 17 порте
+            if(((gpio_interfaces_list[i] == NULL || gpio_interfaces_list[i] == &ONE_WIRE) &&
+                (i != 12)) || //Почему-то не работает на 17 порте
+               (unitemp_gpio_getFromIndex(i) == extraport)) {
                 aviable_ports_count++;
             }
         }
 
         //Проверка для single wire
         if(interface == &SINGLE_WIRE) {
-            if(gpio_interfaces_list[i] == NULL) {
+            if(gpio_interfaces_list[i] == NULL || (unitemp_gpio_getFromIndex(i) == extraport)) {
                 aviable_ports_count++;
             }
         }
@@ -159,16 +160,18 @@ void unitemp_gpio_unlock(const GPIO* gpio) {
     gpio_interfaces_list[i] = NULL;
 }
 
-const GPIO* unitemp_gpio_getAviablePort(const Interface* interface, uint8_t index) {
+const GPIO*
+    unitemp_gpio_getAviablePort(const Interface* interface, uint8_t index, const GPIO* extraport) {
     uint8_t aviable_index = 0;
-    uint8_t aviable_port_count = unitemp_gpio_getAviablePortsCount(interface);
+    uint8_t aviable_port_count = unitemp_gpio_getAviablePortsCount(interface, extraport);
     FURI_LOG_D(APP_NAME, "Aviable ports: %d", aviable_port_count);
     for(uint8_t i = 0; i < GPIO_ITEMS; i++) {
         //Проверка для one wire
         if(interface == &ONE_WIRE) {
             //Почему-то не работает на 17 порте
-            if((gpio_interfaces_list[i] == NULL || gpio_interfaces_list[i] == &ONE_WIRE) &&
-               i != 12) { //Почему-то не работает на 17 порте
+            if(((gpio_interfaces_list[i] == NULL || gpio_interfaces_list[i] == &ONE_WIRE) &&
+                (i != 12)) || //Почему-то не работает на 17 порте
+               (unitemp_gpio_getFromIndex(i) == extraport)) {
                 if(aviable_index == index) {
                     return unitemp_gpio_getFromIndex(i);
                 } else {
@@ -178,7 +181,7 @@ const GPIO* unitemp_gpio_getAviablePort(const Interface* interface, uint8_t inde
         }
         //Проверка для single wire
         if(interface == &SINGLE_WIRE) {
-            if(gpio_interfaces_list[i] == NULL) {
+            if(gpio_interfaces_list[i] == NULL || unitemp_gpio_getFromIndex(i) == extraport) {
                 if(aviable_index == index) {
                     return unitemp_gpio_getFromIndex(i);
                 } else {
@@ -384,6 +387,13 @@ void unitemp_sensors_reload(void) {
     unitemp_sensors_init();
 }
 
+bool unitemp_sensor_isContains(Sensor* sensor) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
+        if(app->sensors[i] == sensor) return true;
+    }
+    return false;
+}
+
 Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, char* args) {
     if(name == NULL || type == NULL) return NULL;
     bool status = false;

+ 12 - 2
Sensors.h

@@ -139,6 +139,14 @@ void unitemp_sensor_free(Sensor* sensor);
  */
 UnitempStatus unitemp_sensor_updateData(Sensor* sensor);
 
+/**
+ * @brief Проверка наличия датчика в памяти
+ * 
+ * @param sensor Указатель на датчик
+ * @return Истина если этот датчик уже загружен, ложь если это новый датчик
+ */
+bool unitemp_sensor_isContains(Sensor* sensor);
+
 /**
  * @brief Загрузка датчиков с SD-карты
  * @return Истина если загрузка прошла успешно
@@ -248,14 +256,16 @@ void unitemp_gpio_unlock(const GPIO* gpio);
  * @param interface Указатель на интерфейс
  * @return Количество доступных портов
  */
-uint8_t unitemp_gpio_getAviablePortsCount(const Interface* interface);
+uint8_t unitemp_gpio_getAviablePortsCount(const Interface* interface, const GPIO* extraport);
 /**
  * @brief Получить указатель на доступный для интерфейса порт по индексу 
  * @param interface Указатель на интерфейс
  * @param index Номер порта (от 0 до unitemp_gpio_getAviablePortsCount())
+ * @param extraport Указатель на дополнительный порт, который будет принудительно считаться доступным. Можно указать NULL если не требуется
  * @return Указатель на доступный порт
  */
-const GPIO* unitemp_gpio_getAviablePort(const Interface* interface, uint8_t index);
+const GPIO*
+    unitemp_gpio_getAviablePort(const Interface* interface, uint8_t index, const GPIO* extraport);
 
 /* Датчики */
 //DHTxx и их производные

+ 7 - 1
views/General_view.c

@@ -215,12 +215,18 @@ static bool _input_callback(InputEvent* event, void* context) {
         if(--sensor_index >= unitemp_sensors_getCount())
             sensor_index = unitemp_sensors_getCount() - 1;
     }
-    //Вход в главное меню по короткому нажатию "Ок"
+    //Вход в главное меню по короткому нажатию "ок"
     if(event->key == InputKeyOk && event->type == InputTypeShort) {
         app->sensors_ready = false;
         unitemp_MainMenu_switch();
     }
 
+    //Редактирование датчика при длинном нажатии "ок"
+    if(event->key == InputKeyOk && event->type == InputTypeLong) {
+        app->sensors_ready = false;
+        unitemp_SensorEdit_switch(app->sensors[sensor_index]);
+    }
+
     return true;
 }
 

+ 6 - 2
views/MainMenu_view.c

@@ -27,10 +27,13 @@ static uint32_t _exit_callback(void* context) {
  */
 static void _enter_callback(void* context, uint32_t index) {
     UNUSED(context);
-    if(index == 0) { //add new sensor
+    if(index == 0) { //Add new sensor
         unitemp_SensorsList_switch();
     }
-    if(index == 1) { //Settings
+    if(index == 1) { //Edit sensor
+        //
+    }
+    if(index == 2) { //Settings
         unitemp_Settings_switch();
     }
 }
@@ -44,6 +47,7 @@ void unitemp_MainMenu_alloc(void) {
     variable_item_list_reset(variable_item_list);
 
     variable_item_list_add(variable_item_list, "Add new sensor", 1, NULL, NULL);
+    variable_item_list_add(variable_item_list, "Edit sensor", 1, NULL, NULL);
     variable_item_list_add(variable_item_list, "Settings", 1, NULL, NULL);
     variable_item_list_add(variable_item_list, "Help", 1, NULL, NULL);
     variable_item_list_add(variable_item_list, "About", 1, NULL, NULL);

+ 27 - 7
views/SensorEdit_view.c

@@ -11,6 +11,8 @@ static View* view;
 static VariableItemList* variable_item_list;
 //Текущий редактируемый датчик
 static Sensor* editable_sensor;
+//Изначальный GPIO датчика
+static const GPIO* initial_gpio;
 //Элемент списка - имя датчика
 static VariableItem* sensor_name_item;
 //Элемент списка - адрес датчика one wire
@@ -121,7 +123,8 @@ static void _onewire_scan(void) {
  */
 static uint32_t _exit_callback(void* context) {
     UNUSED(context);
-    unitemp_sensor_free(editable_sensor);
+
+    if(!unitemp_sensor_isContains(editable_sensor)) unitemp_sensor_free(editable_sensor);
     //Возврат предыдущий вид
     return MAINMENU_VIEW;
 }
@@ -145,7 +148,8 @@ static void _enter_callback(void* context, uint32_t index) {
            ((OneWireSensor*)(editable_sensor->instance))->familyCode == 0) {
             return;
         }
-        unitemp_sensors_add(editable_sensor);
+        unitemp_gpio_unlock(initial_gpio);
+        if(!unitemp_sensor_isContains(editable_sensor)) unitemp_sensors_add(editable_sensor);
         unitemp_sensors_save();
         unitemp_sensors_reload();
 
@@ -166,12 +170,14 @@ static void _gpio_change_callback(VariableItem* item) {
     uint8_t index = variable_item_get_current_value_index(item);
     if(editable_sensor->type->interface == &SINGLE_WIRE) {
         SingleWireSensor* instance = editable_sensor->instance;
-        instance->gpio = unitemp_gpio_getAviablePort(editable_sensor->type->interface, index);
+        instance->gpio =
+            unitemp_gpio_getAviablePort(editable_sensor->type->interface, index, initial_gpio);
         variable_item_set_current_value_text(item, instance->gpio->name);
     }
     if(editable_sensor->type->interface == &ONE_WIRE) {
         OneWireSensor* instance = editable_sensor->instance;
-        instance->bus->gpio = unitemp_gpio_getAviablePort(editable_sensor->type->interface, index);
+        instance->bus->gpio =
+            unitemp_gpio_getAviablePort(editable_sensor->type->interface, index, NULL);
         variable_item_set_current_value_text(item, instance->bus->gpio->name);
     }
 }
@@ -246,12 +252,26 @@ void unitemp_SensorEdit_switch(Sensor* sensor) {
 
     //Порт подключения датчка (для one wire и single wire)
     if(sensor->type->interface == &ONE_WIRE || sensor->type->interface == &SINGLE_WIRE) {
-        uint8_t aviable_gpio_count = unitemp_gpio_getAviablePortsCount(sensor->type->interface);
+        initial_gpio = ((SingleWireSensor*)editable_sensor->instance)->gpio;
+        uint8_t aviable_gpio_count =
+            unitemp_gpio_getAviablePortsCount(sensor->type->interface, initial_gpio);
         VariableItem* item = variable_item_list_add(
             variable_item_list, "GPIO", aviable_gpio_count, _gpio_change_callback, app);
-        variable_item_set_current_value_index(item, 0);
+
+        uint8_t gpio_index = 0;
+        if(unitemp_sensor_isContains(editable_sensor)) {
+            for(uint8_t i = 0; i < aviable_gpio_count; i++) {
+                if(unitemp_gpio_getAviablePort(sensor->type->interface, i, initial_gpio) ==
+                   initial_gpio) {
+                    gpio_index = i;
+                    break;
+                }
+            }
+        }
+        variable_item_set_current_value_index(item, gpio_index);
         variable_item_set_current_value_text(
-            item, unitemp_gpio_getAviablePort(sensor->type->interface, 0)->name);
+            item,
+            unitemp_gpio_getAviablePort(sensor->type->interface, gpio_index, initial_gpio)->name);
     }
     //Адрес устройства на шине I2C (для датчиков I2C)
     if(sensor->type->interface == &I2C) {

+ 5 - 2
views/SensorsList_view.c

@@ -38,7 +38,10 @@ static void _enter_callback(void* context, uint32_t index) {
     //Выбор первого доступного порта для датчика single wire
     if(type->interface == &SINGLE_WIRE) {
         snprintf(
-            args, 4, "%d", unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0)));
+            args,
+            4,
+            "%d",
+            unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0, NULL)));
     }
     //Выбор первого доступного порта для датчика one wire и запись нулевого ID
     if(type->interface == &ONE_WIRE) {
@@ -46,7 +49,7 @@ static void _enter_callback(void* context, uint32_t index) {
             args,
             21,
             "%d %02X%02X%02X%02X%02X%02X%02X%02X",
-            unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0)),
+            unitemp_gpio_toInt(unitemp_gpio_getAviablePort(type->interface, 0, NULL)),
             0,
             0,
             0,