Victor 3 лет назад
Родитель
Сommit
b82826e9f2
7 измененных файлов с 56 добавлено и 14 удалено
  1. 16 0
      Sensors.c
  2. 12 2
      Sensors.h
  3. 7 4
      interfaces/I2CSensor.c
  4. 6 0
      interfaces/I2CSensor.h
  5. 5 4
      sensors/LM75.c
  6. 8 1
      sensors/LM75.h
  7. 2 3
      unitemp.c

+ 16 - 0
Sensors.c

@@ -241,6 +241,22 @@ Sensor* unitemp_sensor_alloc(char* name, SensorType st, uint16_t* anotherValues)
     return NULL;
     return NULL;
 }
 }
 
 
+void unitemp_sensor_free(Sensor* sensor) {
+    //Высвобождение памяти под инстанс датчиков I2C
+    if(sensor->type == BMP280 || sensor->type == LM75) {
+        unitemp_I2C_sensorFree(sensor);
+    }
+    free(sensor->name);
+    free(sensor);
+}
+
+void unitemp_sensors_free(void) {
+    for(size_t i = 0; i < app->sensors_count; i++) {
+        unitemp_sensor_free(app->sensors[i]);
+    }
+    app->sensors_count = 0;
+}
+
 bool unitemp_sensors_init(void) {
 bool unitemp_sensors_init(void) {
     bool result = true;
     bool result = true;
 
 

+ 12 - 2
Sensors.h

@@ -53,7 +53,11 @@ struct Sensor;
 /**
 /**
  * @brief Указатель функции выделения памяти и подготовки экземпляра датчика
  * @brief Указатель функции выделения памяти и подготовки экземпляра датчика
  */
  */
-//typedef void (*SensorAllocator)(Sensor* sensor, SensorType st);
+typedef void(SensorAllocator)(void* sensor, SensorType st);
+/**
+ * @brief Указатель на функцию высвобождении памяти датчика
+ */
+typedef void(SensorFree)(void* sensor);
 /**
 /**
  * @brief Указатель функции инициализации датчика
  * @brief Указатель функции инициализации датчика
  */
  */
@@ -85,7 +89,8 @@ typedef struct Sensor {
 
 
     //Экземпляр датчика
     //Экземпляр датчика
     void* instance;
     void* instance;
-    //SensorAllocator* allocator;
+    SensorAllocator* allocator;
+    SensorFree* memoryfree;
     SensorInitializer* initializer;
     SensorInitializer* initializer;
     SensorDeinitializer* deinitializer;
     SensorDeinitializer* deinitializer;
     SensorUpdater* updater;
     SensorUpdater* updater;
@@ -170,4 +175,9 @@ bool unitemp_sensors_save(void);
  */
  */
 void unitemp_sensors_updateValues(void);
 void unitemp_sensors_updateValues(void);
 
 
+/**
+ * @brief Высвыбождение памяти после датчиков
+ */
+void unitemp_sensors_free(void);
+
 #endif
 #endif

+ 7 - 4
interfaces/I2CSensor.c

@@ -40,10 +40,9 @@ bool unitemp_I2C_sensorInit(void* s) {
     return false;
     return false;
 }
 }
 
 
-bool unitemp_I2C_sensorDeInit(void* sensor) {
-    //TODO датчик в спячку, очистить память
-    UNUSED(sensor);
-    return true;
+bool unitemp_I2C_sensorDeInit(void* s) {
+    Sensor* sensor = (Sensor*)s;
+    return sensor->deinitializer(s);
 }
 }
 
 
 UnitempStatus unitemp_I2C_updateData(void* sensor) {
 UnitempStatus unitemp_I2C_updateData(void* sensor) {
@@ -81,4 +80,8 @@ bool unitemp_I2C_sensorAlloc(Sensor* sensor, SensorType st, uint16_t* anotherVal
         instance->currentI2CAdr = instance->minI2CAdr;
         instance->currentI2CAdr = instance->minI2CAdr;
     }
     }
     return status;
     return status;
+}
+
+void unitemp_I2C_sensorFree(Sensor* sensor) {
+    free(sensor->instance);
 }
 }

+ 6 - 0
interfaces/I2CSensor.h

@@ -71,4 +71,10 @@ bool readRegArray(I2CSensor* i2c_sensor, uint8_t startReg, uint8_t len, uint8_t*
  */
  */
 bool writeReg(I2CSensor* i2c_sensor, uint8_t reg, uint8_t value);
 bool writeReg(I2CSensor* i2c_sensor, uint8_t reg, uint8_t value);
 
 
+/**
+ * @brief Высвобождение памяти инстанса датчика
+ * 
+ * @param sensor Указатель на датчик
+ */
+void unitemp_I2C_sensorFree(Sensor* sensor);
 #endif
 #endif

+ 5 - 4
sensors/LM75.c

@@ -19,6 +19,7 @@ bool unitemp_LM75_alloc(Sensor* sensor) {
     sensor->initializer = unitemp_LM75_init;
     sensor->initializer = unitemp_LM75_init;
     sensor->deinitializer = unitemp_LM75_deinit;
     sensor->deinitializer = unitemp_LM75_deinit;
     sensor->updater = unitemp_LM75_update;
     sensor->updater = unitemp_LM75_update;
+    sensor->memoryfree = unitemp_LM75_free;
     sensor->pollingInterval = 1000;
     sensor->pollingInterval = 1000;
 
 
     //Адреса на шине I2C (7 бит)
     //Адреса на шине I2C (7 бит)
@@ -26,6 +27,10 @@ bool unitemp_LM75_alloc(Sensor* sensor) {
     i2c_sensor->maxI2CAdr = 0b1001111;
     i2c_sensor->maxI2CAdr = 0b1001111;
     return true;
     return true;
 }
 }
+void unitemp_LM75_free(void* s) {
+    //Нечего высвобождать, так как ничего не было выделено
+    UNUSED(s);
+}
 
 
 bool unitemp_LM75_init(void* s) {
 bool unitemp_LM75_init(void* s) {
     Sensor* sensor = (Sensor*)s;
     Sensor* sensor = (Sensor*)s;
@@ -43,8 +48,6 @@ bool unitemp_LM75_deinit(void* s) {
     I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance;
     I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance;
     if(!writeReg(i2c_sensor, LM75_REG_CONFIG, LM75_CONFIG_FAULTQUEUE_1 | LM75_CONFIG_SHUTDOWN))
     if(!writeReg(i2c_sensor, LM75_REG_CONFIG, LM75_CONFIG_FAULTQUEUE_1 | LM75_CONFIG_SHUTDOWN))
         return false;
         return false;
-    UNUSED(sensor);
-    UNUSED(i2c_sensor);
     return true;
     return true;
 }
 }
 
 
@@ -62,7 +65,5 @@ UnitempStatus unitemp_LM75_update(void* s) {
     }
     }
     sensor->temp = (float)raw / 2.0f;
     sensor->temp = (float)raw / 2.0f;
 
 
-    FURI_LOG_D(APP_NAME, "Sensor %s updated %f", sensor->name, (double)raw / (double)2.0);
-
     return UT_OK;
     return UT_OK;
 }
 }

+ 8 - 1
sensors/LM75.h

@@ -22,7 +22,7 @@ bool unitemp_LM75_alloc(Sensor* sensor);
 bool unitemp_LM75_init(void* sensor);
 bool unitemp_LM75_init(void* sensor);
 
 
 /**
 /**
- * @brief Деинициализация датчика, очистка памяти
+ * @brief Деинициализация датчика
  * 
  * 
  * @param sensor Указатель на датчик (тип Sensor)
  * @param sensor Указатель на датчик (тип Sensor)
  */
  */
@@ -36,4 +36,11 @@ bool unitemp_LM75_deinit(void* s);
  */
  */
 UnitempStatus unitemp_LM75_update(void* s);
 UnitempStatus unitemp_LM75_update(void* s);
 
 
+/**
+ * @brief Высвободить память датчика
+ * 
+ * @param sensor Указатель на датчик (тип Sensor)
+ */
+void unitemp_LM75_free(void* sensor);
+
 #endif
 #endif

+ 2 - 3
unitemp.c

@@ -219,9 +219,8 @@ static void unitemp_free(void) {
     view_dispatcher_free(app->view_dispatcher);
     view_dispatcher_free(app->view_dispatcher);
     furi_record_close(RECORD_GUI);
     furi_record_close(RECORD_GUI);
     //Очистка датчиков
     //Очистка датчиков
-    for(size_t i = 0; i < app->sensors_count; i++) {
-        free(app->sensors[i]);
-    }
+    //Высвыбождение данных датчиков
+    unitemp_sensors_free();
     free(app->sensors);
     free(app->sensors);
     //Закрытие уведомлений
     //Закрытие уведомлений
     furi_record_close(RECORD_NOTIFICATION);
     furi_record_close(RECORD_NOTIFICATION);