Ver Fonte

Improved loading sensors from config, custom allocator arguments

Victor há 3 anos atrás
pai
commit
7438446fb9
6 ficheiros alterados com 78 adições e 19 exclusões
  1. 26 10
      Sensors.c
  2. 12 5
      Sensors.h
  3. 4 2
      interfaces/I2CSensor.c
  4. 25 1
      interfaces/OneWireSensor.c
  5. 5 1
      interfaces/SingleWireSensor.c
  6. 6 0
      unitemp.c

+ 26 - 10
Sensors.c

@@ -62,6 +62,17 @@ const SensorType* unitemp_sensors_getTypeFromInt(uint8_t index) {
     return sensorTypes[index];
 }
 
+const SensorType* unitemp_sensors_getTypeFromStr(char* str) {
+    UNUSED(str);
+    if(str == NULL) return NULL;
+    for(uint8_t i = 0; i < unitemp_sensors_getTypesCount(); i++) {
+        if(!strcmp(str, sensorTypes[i]->typename)) {
+            return sensorTypes[i];
+        }
+    }
+    return NULL;
+}
+
 uint8_t unitemp_sensors_getTypesCount(void) {
     return SENSOR_TYPES_COUNT;
 }
@@ -247,27 +258,31 @@ bool unitemp_sensors_load(void) {
     while(line_end != STRING_FAILURE) {
         //Имя датчика
         char name[11] = {0};
-        //Переменные для типа датчика и его аргументов
-        int type = 255, arg = 255;
+        //Тип датчика
+        char type[11] = {0};
+        //Смещение по строке для отделения аргументов
+        int offset = 0;
         //Чтение из строки
-        sscanf(((char*)(file_buf + line_end)), "%s %d %d", name, &type, &arg);
+        sscanf(((char*)(file_buf + line_end)), "%s %s %n", name, type, &offset);
         //Ограничение длины имени
         name[10] = '\0';
-        FURI_LOG_D(APP_NAME, "%s %d %d", name, type, arg);
-        //Вычисление конца строки
-        line_end = furi_string_search_char(file, '\n', line_end + 1);
+        FURI_LOG_D(APP_NAME, "%s %s", name, type);
 
-        char args[] = {arg};
+        char* args = ((char*)(file_buf + line_end + offset));
         //Проверка типа датчика
-        if(type < SENSOR_TYPES_COUNT && sizeof(name) <= 11) {
+        if(sizeof(name) <= 11) {
             Sensor* sensor =
-                unitemp_sensor_alloc(name, unitemp_sensors_getTypeFromInt(type), args);
+                unitemp_sensor_alloc(name, unitemp_sensors_getTypeFromStr(type), args);
             if(sensor != NULL) {
                 app->sensors[app->sensors_count++] = sensor;
+            } else {
+                FURI_LOG_E(APP_NAME, "Failed sensor (%s:%s) mem allocation", name, type);
             }
         } else {
-            FURI_LOG_E(APP_NAME, "Unsupported sensor name (%s) or sensor type (%d)", name, type);
+            FURI_LOG_E(APP_NAME, "Unsupported sensor name (%s) or sensor type (%s)", name, type);
         }
+        //Вычисление конца строки
+        line_end = furi_string_search_char(file, '\n', line_end + 1);
     }
 
     free(file_buf);
@@ -339,6 +354,7 @@ void unitemp_sensors_reload(void) {
 }
 
 Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, char* args) {
+    if(name == NULL || type == NULL) return NULL;
     bool status = false;
     //Выделение памяти под датчик
     Sensor* sensor = malloc(sizeof(Sensor));

+ 12 - 5
Sensors.h

@@ -162,6 +162,12 @@ void unitemp_sensors_free(void);
  */
 void unitemp_sensors_updateValues(void);
 
+/**
+* @brief Получить списк доступных типов датчиков
+* @return Указатель на список датчиков
+*/
+const SensorType** unitemp_sensors_getTypes(void);
+
 /**
 * @brief Получить количество доступных типов датчиков
 * @return Количество доступных типов датчиков
@@ -170,17 +176,18 @@ uint8_t unitemp_sensors_getTypesCount(void);
 
 /**
  * @brief Получить тип сенсора по его индексу
- * 
  * @param index Индекс типа датчика (от 0 до SENSOR_TYPES_COUNT)
  * @return const SensorType* 
  */
 const SensorType* unitemp_sensors_getTypeFromInt(uint8_t index);
 
 /**
-* @brief Получить списк доступных типов датчиков
-* @return Указатель на список датчиков
-*/
-const SensorType** unitemp_sensors_getTypes(void);
+ * @brief Преобразовать строчное название датчка в указатель
+ * 
+ * @param str Имя датчика в виде строки
+ * @return Указатель на тип датчика при успехе, иначе NULL
+ */
+const SensorType* unitemp_sensors_getTypeFromStr(char* str);
 
 /* ============================= GPIO ============================= */
 /**

+ 4 - 2
interfaces/I2CSensor.c

@@ -41,10 +41,12 @@ bool unitemp_I2C_sensor_alloc(Sensor* sensor, char* args) {
 
     //Указание функций инициализации, деинициализации и обновления данных, а так же адреса на шине I2C
     status = sensor->type->allocator(sensor, args);
+    int i2c_addr;
+    sscanf(args, "%d", &i2c_addr);
 
     //Установка адреса шины I2C
-    if(args[0] >= instance->minI2CAdr && args[0] <= instance->maxI2CAdr) {
-        instance->currentI2CAdr = args[0];
+    if(i2c_addr >= instance->minI2CAdr && i2c_addr <= instance->maxI2CAdr) {
+        instance->currentI2CAdr = i2c_addr;
     } else {
         instance->currentI2CAdr = instance->minI2CAdr;
     }

+ 25 - 1
interfaces/OneWireSensor.c

@@ -269,7 +269,31 @@ bool unitemp_onewire_sensor_alloc(Sensor* sensor, char* args) {
     //Очистка адреса
     memset(instance->deviceID, 0, 8);
 
-    instance->bus = uintemp_onewire_bus_alloc(unitemp_gpio_getFromInt(args[0]));
+    int gpio, addr_0, addr_1, addr_2, addr_3, addr_4, addr_5, addr_6, addr_7;
+    sscanf(
+        args,
+        "%d %2X%2X%2X%2X%2X%2X%2X%2X",
+        &gpio,
+        &addr_0,
+        &addr_1,
+        &addr_2,
+        &addr_3,
+        &addr_4,
+        &addr_5,
+        &addr_6,
+        &addr_7);
+    instance->deviceID[0] = addr_0;
+    instance->deviceID[1] = addr_1;
+    instance->deviceID[2] = addr_2;
+    instance->deviceID[3] = addr_3;
+    instance->deviceID[4] = addr_4;
+    instance->deviceID[5] = addr_5;
+    instance->deviceID[6] = addr_6;
+    instance->deviceID[7] = addr_7;
+
+    instance->familyCode = instance->deviceID[0];
+
+    instance->bus = uintemp_onewire_bus_alloc(unitemp_gpio_getFromInt(gpio));
     if(instance != NULL) {
         return true;
     }

+ 5 - 1
interfaces/SingleWireSensor.c

@@ -51,6 +51,7 @@ const SensorType AM2320_SW = {
     .updater = unitemp_singlewire_update};
 
 bool unitemp_singlewire_alloc(Sensor* sensor, char* args) {
+    if(args == NULL) return false;
     SingleWireSensor* instance = malloc(sizeof(SingleWireSensor));
     if(instance == NULL) {
         FURI_LOG_E(APP_NAME, "Sensor %s instance allocation error", sensor->name);
@@ -58,7 +59,10 @@ bool unitemp_singlewire_alloc(Sensor* sensor, char* args) {
     }
     sensor->instance = instance;
 
-    if(unitemp_singlewire_sensorSetGPIO(sensor, unitemp_gpio_getFromInt(args[0]))) {
+    int gpio;
+    sscanf(args, "%d", &gpio);
+
+    if(unitemp_singlewire_sensorSetGPIO(sensor, unitemp_gpio_getFromInt(gpio))) {
         return true;
     }
     FURI_LOG_E(APP_NAME, "Sensor %s GPIO setting error", sensor->name);

+ 6 - 0
unitemp.c

@@ -6,6 +6,12 @@
 #include <furi_hal_power.h>
 #include <m-string.h>
 
+//TODO: Реализовать ограничение на добавление датчиков если интерфейс недоступен
+//TODO: Исправить падение при сохранении датчка
+//TODO: Реализовать сохранение ID DS18x2x
+//TODO: Тип датчика сохраняется в виде строки, а не числа
+//TODO: Исключить добавление датчиков DS18x2x с одинаковыми ID
+
 /* Переменные */
 //Данные приложения
 Unitemp* app;