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

Improved deinitialization and one wire memory release

Victor 3 лет назад
Родитель
Сommit
2b54068141
5 измененных файлов с 35 добавлено и 28 удалено
  1. 7 7
      Sensors.c
  2. 24 17
      interfaces/OneWireSensor.c
  3. 1 1
      interfaces/OneWireSensor.h
  4. 2 2
      unitemp.c
  5. 1 1
      unitemp.h

+ 7 - 7
Sensors.c

@@ -125,10 +125,10 @@ bool unitemp_sensors_load() {
     }
 
     //Вычисление размера файла
-    size_t file_size = stream_size(app->file_stream);
+    uint8_t file_size = stream_size(app->file_stream);
     FURI_LOG_D(APP_NAME, "Sensors file size: %d bytes", file_size);
     //Если файл пустой, то:
-    if(file_size == (size_t)0) {
+    if(file_size == (uint8_t)0) {
         FURI_LOG_W(APP_NAME, "Sensors file is empty");
         //Закрытие потока и освобождение памяти
         file_stream_close(app->file_stream);
@@ -208,7 +208,7 @@ bool unitemp_sensors_save(void) {
     }
 
     //Сохранение датчиков
-    for(size_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < app->sensors_count; i++) {
         if(app->sensors[i]->type->interface == &SINGLE_WIRE) {
             stream_write_format(
                 app->file_stream,
@@ -304,7 +304,7 @@ void unitemp_sensor_free(Sensor* sensor) {
 }
 
 void unitemp_sensors_free(void) {
-    for(size_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < app->sensors_count; i++) {
         unitemp_sensor_free(app->sensors[i]);
     }
     app->sensors_count = 0;
@@ -314,7 +314,7 @@ bool unitemp_sensors_init(void) {
     bool result = true;
 
     //Перебор датчиков из списка
-    for(size_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < app->sensors_count; i++) {
         //Включение 5V если на порту 1 FZ его нет
         //Может пропасть при отключении USB
         if(furi_hal_power_is_otg_enabled() != true) {
@@ -342,7 +342,7 @@ bool unitemp_sensors_deInit(void) {
     }
 
     //Перебор датчиков из списка
-    for(size_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < app->sensors_count; i++) {
         if(!(*app->sensors[i]->type->deinitializer)(app->sensors[i])) {
             FURI_LOG_E(
                 APP_NAME,
@@ -381,7 +381,7 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) {
 }
 
 void unitemp_sensors_updateValues(void) {
-    for(size_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < app->sensors_count; i++) {
         unitemp_sensor_updateData(app->sensors[i]);
     }
 }

+ 24 - 17
interfaces/OneWireSensor.c

@@ -20,9 +20,10 @@ OneWireBus* uintemp_OneWire_bus_alloc(const GPIO* gpio) {
         return NULL;
     }
     //Проверка на наличие шины на этом порте
-    for(size_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < app->sensors_count; i++) {
         if(app->sensors[i]->type == &DS18x2x &&
            ((OneWireBus*)(app->sensors[i]->instance))->gpio == gpio) {
+            ((OneWireBus*)(app->sensors[i]->instance))->device_count++;
             return ((OneWireBus*)(app->sensors[i]->instance));
         }
     }
@@ -36,9 +37,8 @@ OneWireBus* uintemp_OneWire_bus_alloc(const GPIO* gpio) {
         GpioSpeedVeryHigh); //Скорость работы - максимальная
 
     OneWireBus* bus = malloc(sizeof(OneWireBus));
-    bus->device_count = 0;
+    bus->device_count = 1;
     bus->gpio = gpio;
-
     bus->powerMode = PWR_ACTIVE;
 
     return bus;
@@ -132,8 +132,8 @@ static uint8_t oneWire_read(OneWireSensor* instance) {
  * @param data Указатель на массив, куда будут записаны данные
  * @param len Количество байт
  */
-static void oneWire_readBytes(OneWireSensor* instance, uint8_t* data, size_t len) {
-    for(size_t i = 0; i < len; i++) {
+static void oneWire_readBytes(OneWireSensor* instance, uint8_t* data, uint8_t len) {
+    for(uint8_t i = 0; i < len; i++) {
         data[i] = oneWire_read(instance);
     }
 }
@@ -146,9 +146,9 @@ static uint8_t onewire_CRC_update(uint8_t crc, uint8_t b) {
     return crc;
 }
 
-static bool onewire_CRC_check(uint8_t* data, size_t len) {
+static bool onewire_CRC_check(uint8_t* data, uint8_t len) {
     uint8_t crc = 0;
-    for(size_t i = 0; i < len; i++) {
+    for(uint8_t i = 0; i < len; i++) {
         crc = onewire_CRC_update(crc, data[i]);
     }
     return !crc;
@@ -161,8 +161,8 @@ static bool onewire_CRC_check(uint8_t* data, size_t len) {
  * @param data Указатель на массив, откуда будут записаны данные
  * @param len Количество байт
  */
-static void oneWire_writeBytes(OneWireSensor* instance, uint8_t* data, size_t len) {
-    for(size_t i = 0; i < len; i++) {
+static void oneWire_writeBytes(OneWireSensor* instance, uint8_t* data, uint8_t len) {
+    for(uint8_t i = 0; i < len; i++) {
         oneWire_write(instance, data[i]);
     }
 }
@@ -291,6 +291,9 @@ bool unitemp_OneWire_sensor_alloc(void* s, uint8_t* anotherValues) {
 
 bool unitemp_OneWire_sensor_free(void* s) {
     Sensor* sensor = (Sensor*)s;
+    if(((OneWireSensor*)sensor->instance)->bus->device_count == 0) {
+        free(((OneWireSensor*)sensor->instance)->bus);
+    }
     free(sensor->instance);
 
     return true;
@@ -363,14 +366,18 @@ bool unitemp_OneWire_sensor_init(void* s) {
 bool unitemp_OneWire_sensor_deinit(void* s) {
     OneWireSensor* instance = ((Sensor*)s)->instance;
     if(instance == NULL || instance->bus->gpio == NULL) return false;
-    //Низкий уровень по умолчанию
-    furi_hal_gpio_write(instance->bus->gpio->pin, false);
-    //Режим работы - аналог, подтяжка выключена
-    furi_hal_gpio_init(
-        instance->bus->gpio->pin, //Порт FZ
-        GpioModeAnalog, //Режим работы - аналог
-        GpioPullNo, //Подтяжка выключена
-        GpioSpeedLow); //Скорость работы - минимальная
+    instance->bus->device_count--;
+    if(instance->bus->device_count == 0) {
+        //Низкий уровень по умолчанию
+        furi_hal_gpio_write(instance->bus->gpio->pin, false);
+        //Режим работы - аналог, подтяжка выключена
+        furi_hal_gpio_init(
+            instance->bus->gpio->pin, //Порт FZ
+            GpioModeAnalog, //Режим работы - аналог
+            GpioPullNo, //Подтяжка выключена
+            GpioSpeedLow); //Скорость работы - минимальная
+    }
+
     return true;
 }
 

+ 1 - 1
interfaces/OneWireSensor.h

@@ -21,7 +21,7 @@ typedef struct {
     const GPIO* gpio;
     //Количество устройств на шине
     //Обновляется при ручном добавлении датчика на эту шину
-    size_t device_count;
+    uint8_t device_count;
     //Режим питания датчиков на шине
     PowerMode powerMode;
 } OneWireBus;

+ 2 - 2
unitemp.c

@@ -100,10 +100,10 @@ static bool unitemp_loadSettings(void) {
     }
 
     //Вычисление размера файла
-    size_t file_size = stream_size(app->file_stream);
+    uint8_t file_size = stream_size(app->file_stream);
     FURI_LOG_D(APP_NAME, "Settings file size: %d bytes\r\n", file_size);
     //Если файл пустой, то:
-    if(file_size == (size_t)0) {
+    if(file_size == (uint8_t)0) {
         FURI_LOG_W(APP_NAME, "Settings file is empty\r\n");
         //Закрытие потока и освобождение памяти
         file_stream_close(app->file_stream);

+ 1 - 1
unitemp.h

@@ -54,7 +54,7 @@ typedef struct {
     //Список указателей на датчики
     Sensor* sensors[MAX_SENSORS];
     //Количество загруженных датчиков
-    size_t sensors_count;
+    uint8_t sensors_count;
 
     //SD-карта
     Storage* storage; //Хранилище