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

Accelerated processing of missing sensors. Minor code cleanup

Victor 3 лет назад
Родитель
Сommit
cc1b873df2
5 измененных файлов с 8 добавлено и 33 удалено
  1. 0 6
      Sensors.c
  2. 4 4
      interfaces/I2CSensor.c
  3. 1 1
      interfaces/SingleWireSensor.c
  4. 2 19
      sensors/BMP280.c
  5. 1 3
      unitemp.c

+ 0 - 6
Sensors.c

@@ -164,7 +164,6 @@ 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, 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) {
@@ -199,17 +198,14 @@ uint8_t unitemp_sensors_getCount(void) {
 }
 
 void unitemp_sensors_add(Sensor* sensor) {
-    FURI_LOG_D(APP_NAME, "realloc to %d", unitemp_sensors_getCount() + 1);
     app->sensors =
         (Sensor**)realloc(app->sensors, (unitemp_sensors_getCount() + 1) * sizeof(Sensor*));
-    FURI_LOG_D(APP_NAME, "adding to %d", unitemp_sensors_getCount());
     app->sensors[unitemp_sensors_getCount()] = sensor;
     app->sensors_count++;
 }
 
 bool unitemp_sensors_load(void) {
     FURI_LOG_D(APP_NAME, "Loading sensors...");
-    //memset(app->sensors, 0, (unitemp_sensors_getCount() + 1) * sizeof(Sensor*));
 
     //Выделение памяти на поток
     app->file_stream = file_stream_alloc(app->storage);
@@ -242,7 +238,6 @@ bool unitemp_sensors_load(void) {
 
     //Вычисление размера файла
     uint8_t file_size = stream_size(app->file_stream);
-    FURI_LOG_D(APP_NAME, "Sensors file size: %d bytes", file_size);
     //Если файл пустой, то:
     if(file_size == (uint8_t)0) {
         FURI_LOG_W(APP_NAME, "Sensors file is empty");
@@ -282,7 +277,6 @@ bool unitemp_sensors_load(void) {
         sscanf(((char*)(file_buf + line_end)), "%s %s %n", name, type, &offset);
         //Ограничение длины имени
         name[10] = '\0';
-        FURI_LOG_D(APP_NAME, "%s %s", name, type);
 
         char* args = ((char*)(file_buf + line_end + offset));
         const SensorType* stype = unitemp_sensors_getTypeFromStr(type);

+ 4 - 4
interfaces/I2CSensor.c

@@ -6,7 +6,7 @@ uint8_t unitemp_i2c_readReg(I2CSensor* i2c_sensor, uint8_t reg) {
     //Блокировка шины
     furi_hal_i2c_acquire(i2c_sensor->i2c);
     uint8_t buff[1];
-    furi_hal_i2c_read_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 0xFF);
+    furi_hal_i2c_read_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 10);
     furi_hal_i2c_release(i2c_sensor->i2c);
     return buff[0];
 }
@@ -14,7 +14,7 @@ uint8_t unitemp_i2c_readReg(I2CSensor* i2c_sensor, uint8_t reg) {
 bool unitemp_i2c_readRegArray(I2CSensor* i2c_sensor, uint8_t startReg, uint8_t len, uint8_t* data) {
     furi_hal_i2c_acquire(i2c_sensor->i2c);
     bool status = furi_hal_i2c_read_mem(
-        i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, startReg, data, len, 0xFF);
+        i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, startReg, data, len, 10);
     furi_hal_i2c_release(i2c_sensor->i2c);
     return status;
 }
@@ -23,8 +23,8 @@ bool unitemp_i2c_writeReg(I2CSensor* i2c_sensor, uint8_t reg, uint8_t value) {
     //Блокировка шины
     furi_hal_i2c_acquire(i2c_sensor->i2c);
     uint8_t buff[1] = {value};
-    bool status = furi_hal_i2c_write_mem(
-        i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 0xFF);
+    bool status =
+        furi_hal_i2c_write_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 10);
     furi_hal_i2c_release(i2c_sensor->i2c);
     return status;
 }

+ 1 - 1
interfaces/SingleWireSensor.c

@@ -1,7 +1,7 @@
 #include "SingleWireSensor.h"
 
 //Максимальное количество попугаев ожидания датчика
-#define POLLING_TIMEOUT_TICKS 10000
+#define POLLING_TIMEOUT_TICKS 500
 
 /* Типы датчиков и их параметры */
 const SensorType DHT11 = {

+ 2 - 19
sensors/BMP280.c

@@ -74,25 +74,8 @@ static double bmp280_compensate_T_double(I2CSensor* i2c_sensor, int32_t adc_T) {
     return T;
 }
 
-static double bmp280_compensate_P_double(I2CSensor* i2c_sensor, int32_t adc_P) {
+static uint32_t bmp280_compensate_P_int(I2CSensor* i2c_sensor, int32_t adc_P) {
     BMP280_instance* bmp280_instance = (BMP280_instance*)i2c_sensor->sensorInstance;
-    // double var1, var2, p;
-    // var1 = ((double)bmp280_instance->t_fine / (double)2.0) - (double)64000.0;
-    // var2 = var1 * var1 * ((double)bmp280_instance->press_cal.dig_P6) / (double)32768.0;
-    // var2 = var2 + var1 * ((double)bmp280_instance->press_cal.dig_P5) * (double)2.0;
-    // var2 = (var2 / (double)4.0) + (((double)bmp280_instance->press_cal.dig_P4) * (double)65536.0);
-    // var1 = (((double)bmp280_instance->press_cal.dig_P3) * var1 * var1 / (double)524288.0 +
-    //         ((double)bmp280_instance->press_cal.dig_P2) * var1) /
-    //        (double)524288.0;
-    // var1 = ((double)1.0 + var1 / (double)32768.0) * ((double)bmp280_instance->press_cal.dig_P1);
-    // if(var1 == (double)0.0) {
-    //     return 0; // avoid exception caused by division by zero
-    // }
-    // p = (double)1048576.0 - (double)adc_P;
-    // p = (p - (var2 / (double)4096.0)) * (double)6250.0 / var1;
-    // var1 = ((double)bmp280_instance->press_cal.dig_P9) * p * p / (double)2147483648.0;
-    // var2 = p * ((double)bmp280_instance->press_cal.dig_P8) / (double)32768.0;
-    // p = p + (var1 + var2 + ((double)bmp280_instance->press_cal.dig_P7)) / (double)16.0;
     int64_t value_1 = (bmp280_instance->t_fine) - 128000;
     int64_t value_2 = value_1 * value_1 * (int64_t)bmp280_instance->press_cal.dig_P6;
     value_2 = value_2 + ((value_1 * (int64_t)bmp280_instance->press_cal.dig_P5) << 17);
@@ -227,7 +210,7 @@ UnitempStatus unitemp_BMP280_update(Sensor* sensor) {
     if(!unitemp_i2c_readRegArray(i2c_sensor, 0xF7, 3, buff)) return UT_TIMEOUT;
     int32_t adc_P = ((int32_t)buff[0] << 12) | ((int32_t)buff[1] << 4) | ((int32_t)buff[2] >> 4);
     sensor->temp = bmp280_compensate_T_double(i2c_sensor, adc_T);
-    sensor->pressure = bmp280_compensate_P_double(i2c_sensor, adc_P);
+    sensor->pressure = bmp280_compensate_P_int(i2c_sensor, adc_P);
     FURI_LOG_D(APP_NAME, "pressure: %d pa ", (int)sensor->pressure);
     return UT_OK;
 }

+ 1 - 3
unitemp.c

@@ -11,12 +11,11 @@
 //TODO: Исправить зависание BMP280
 //TODO: BMP280 SPI
 //TODO: Вид при отсутствии датчиков
-//TODO: Ограничение длины названия датчика (в пикселях) в виде листа датчиков
 //TODO: Ограничение на добавление датчика I2C с адресом уже имеющегося датчика
-//TODO: Ускорить обработку отсутствующих датчиков
 //TODO: Добавить настройку единицы измерения давления
 //TODO: Обновлять данные только с тех датчиков, которые присутствуют на экране
 //TODO: Исправить сканирование one wire существующего датчика
+//TODO: Исправить крах при добавлении I2C датчика при отсутствии других датчиков
 
 /* Переменные */
 //Данные приложения
@@ -102,7 +101,6 @@ bool unitemp_loadSettings(void) {
 
     //Вычисление размера файла
     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 == (uint8_t)0) {
         FURI_LOG_W(APP_NAME, "Settings file is empty\r\n");