Quellcode durchsuchen

Added more pressure units

Victor vor 3 Jahren
Ursprung
Commit
4216f80b51

+ 9 - 2
Sensors.c

@@ -611,10 +611,17 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) {
         FURI_LOG_D(APP_NAME, "Sensor %s update status %d", sensor->name, sensor->status);
         FURI_LOG_D(APP_NAME, "Sensor %s update status %d", sensor->name, sensor->status);
 #endif
 #endif
 
 
-    if(app->settings.unit == FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK)
+    if(app->settings.temp_unit == UT_TEMP_FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK)
         uintemp_celsiumToFarengate(sensor);
         uintemp_celsiumToFarengate(sensor);
     if(sensor->status == UT_SENSORSTATUS_OK) {
     if(sensor->status == UT_SENSORSTATUS_OK) {
-        unitemp_pascalToMmHg(sensor);
+        FURI_LOG_D(APP_NAME, "Pressure: %f Pa", (double)sensor->pressure);
+        if(app->settings.pressure_unit == UT_PRESSURE_MM_HG) {
+            unitemp_pascalToMmHg(sensor);
+        } else if(app->settings.pressure_unit == UT_PRESSURE_IN_HG) {
+            unitemp_pascalToInHg(sensor);
+        } else if(app->settings.pressure_unit == UT_PRESSURE_KPA) {
+            unitemp_pascalToKPa(sensor);
+        }
     }
     }
     return sensor->status;
     return sensor->status;
 }
 }

BIN
assets/in_hg_15x15.png


BIN
assets/mm_hg_15x15.png


BIN
assets/mm_hg_17x15.png


+ 1 - 1
interfaces/OneWireSensor.c

@@ -464,7 +464,7 @@ UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) {
     return UT_SENSORSTATUS_OK;
     return UT_SENSORSTATUS_OK;
 }
 }
 
 
-bool unitemp_onewire_id_compare(uint8_t* id1, uint8_t* id2) {
+bool unitemp_onewire_id_coUT_PRESSURE_KPAre(uint8_t* id1, uint8_t* id2) {
     if(id1 == NULL || id2 == NULL) return false;
     if(id1 == NULL || id2 == NULL) return false;
     for(uint8_t i = 0; i < 8; i++) {
     for(uint8_t i = 0; i < 8; i++) {
         if(id1[i] != id2[i]) return false;
         if(id1[i] != id2[i]) return false;

+ 1 - 1
interfaces/OneWireSensor.h

@@ -217,7 +217,7 @@ uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus);
  * @param id2 Указатель на адрес второго датчика
  * @param id2 Указатель на адрес второго датчика
  * @return Истина если ID индентичны
  * @return Истина если ID индентичны
  */
  */
-bool unitemp_onewire_id_compare(uint8_t* id1, uint8_t* id2);
+bool unitemp_onewire_id_coUT_PRESSURE_KPAre(uint8_t* id1, uint8_t* id2);
 
 
 extern const SensorType Dallas;
 extern const SensorType Dallas;
 #endif
 #endif

+ 20 - 19
sensors/BMP280.c

@@ -91,25 +91,26 @@ static double bmp280_compensate_T_double(I2CSensor* i2c_sensor, int32_t adc_T) {
     return T;
     return T;
 }
 }
 
 
-static uint32_t bmp280_compensate_P_int(I2CSensor* i2c_sensor, int32_t adc_P) {
+static double bmp280_compensate_P_double(I2CSensor* i2c_sensor, int32_t adc_P) {
     BMP280_instance* bmp280_instance = (BMP280_instance*)i2c_sensor->sensorInstance;
     BMP280_instance* bmp280_instance = (BMP280_instance*)i2c_sensor->sensorInstance;
-    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);
-    value_2 = value_2 + (((int64_t)bmp280_instance->press_cal.dig_P4) << 35);
-    value_1 = ((value_1 * value_1 * (int64_t)bmp280_instance->press_cal.dig_P3) >> 8) +
-              ((value_1 * (int64_t)bmp280_instance->press_cal.dig_P2) << 12);
-    value_1 = (((((int64_t)1) << 47) + value_1)) * ((int64_t)bmp280_instance->press_cal.dig_P1) >>
-              33;
-
-    if(!value_1) return 0; // Avoid division by zero
-
-    int64_t p = 1048576 - adc_P;
-    p = (((p << 31) - value_2) * 3125) / value_1;
-    value_1 = (((int64_t)bmp280_instance->press_cal.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
-    value_2 = (((int64_t)bmp280_instance->press_cal.dig_P8) * p) >> 19;
-    p = ((p + value_1 + value_2) >> 8) + (((int64_t)bmp280_instance->press_cal.dig_P7) << 4);
-    return p / 256.0;
+    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;
+    return p;
 }
 }
 
 
 static bool bmp280_readCalValues(I2CSensor* i2c_sensor) {
 static bool bmp280_readCalValues(I2CSensor* i2c_sensor) {
@@ -240,7 +241,7 @@ UnitempStatus unitemp_BMP280_update(Sensor* sensor) {
     if(!unitemp_i2c_readRegArray(i2c_sensor, 0xF7, 3, buff)) return UT_SENSORSTATUS_TIMEOUT;
     if(!unitemp_i2c_readRegArray(i2c_sensor, 0xF7, 3, buff)) return UT_SENSORSTATUS_TIMEOUT;
     int32_t adc_P = ((int32_t)buff[0] << 12) | ((int32_t)buff[1] << 4) | ((int32_t)buff[2] >> 4);
     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->temp = bmp280_compensate_T_double(i2c_sensor, adc_T);
-    sensor->pressure = bmp280_compensate_P_int(i2c_sensor, adc_P);
+    sensor->pressure = bmp280_compensate_P_double(i2c_sensor, adc_P);
     return UT_SENSORSTATUS_OK;
     return UT_SENSORSTATUS_OK;
 }
 }
 
 

+ 20 - 15
unitemp.c

@@ -32,7 +32,13 @@ void uintemp_celsiumToFarengate(Sensor* sensor) {
 }
 }
 
 
 void unitemp_pascalToMmHg(Sensor* sensor) {
 void unitemp_pascalToMmHg(Sensor* sensor) {
-    sensor->pressure = sensor->pressure * 0.00750061683f;
+    sensor->pressure = sensor->pressure * 0.007500638;
+}
+void unitemp_pascalToKPa(Sensor* sensor) {
+    sensor->pressure = sensor->pressure / 1000.0f;
+}
+void unitemp_pascalToInHg(Sensor* sensor) {
+    sensor->pressure = sensor->pressure * 0.0002953007;
 }
 }
 
 
 bool unitemp_saveSettings(void) {
 bool unitemp_saveSettings(void) {
@@ -61,7 +67,8 @@ bool unitemp_saveSettings(void) {
     //Сохранение настроек
     //Сохранение настроек
     stream_write_format(
     stream_write_format(
         app->file_stream, "INFINITY_BACKLIGHT %d\n", app->settings.infinityBacklight);
         app->file_stream, "INFINITY_BACKLIGHT %d\n", app->settings.infinityBacklight);
-    stream_write_format(app->file_stream, "UNIT %d\n", app->settings.unit);
+    stream_write_format(app->file_stream, "TEMP_UNIT %d\n", app->settings.temp_unit);
+    stream_write_format(app->file_stream, "PRESSURE_UNIT %d\n", app->settings.pressure_unit);
 
 
     //Закрытие потока и освобождение памяти
     //Закрытие потока и освобождение памяти
     file_stream_close(app->file_stream);
     file_stream_close(app->file_stream);
@@ -148,20 +155,17 @@ bool unitemp_loadSettings(void) {
             //Чтение значения параметра
             //Чтение значения параметра
             int p = 0;
             int p = 0;
             sscanf(((char*)(file_buf + line_end)), "INFINITY_BACKLIGHT %d", &p);
             sscanf(((char*)(file_buf + line_end)), "INFINITY_BACKLIGHT %d", &p);
-            if(p == 0) {
-                app->settings.infinityBacklight = false;
-            } else {
-                app->settings.infinityBacklight = true;
-            }
-        } else if(!strcmp(buff, "UNIT")) {
+            app->settings.infinityBacklight = p;
+        } else if(!strcmp(buff, "TEMP_UNIT")) {
+            //Чтение значения параметра
+            int p = 0;
+            sscanf(((char*)(file_buf + line_end)), "\nTEMP_UNIT %d", &p);
+            app->settings.temp_unit = p;
+        } else if(!strcmp(buff, "PRESSURE_UNIT")) {
             //Чтение значения параметра
             //Чтение значения параметра
             int p = 0;
             int p = 0;
-            sscanf(((char*)(file_buf + line_end)), "\nUNIT %d", &p);
-            if(p == CELSIUS) {
-                app->settings.unit = CELSIUS;
-            } else {
-                app->settings.unit = FAHRENHEIT;
-            }
+            sscanf(((char*)(file_buf + line_end)), "\nPRESSURE_UNIT %d", &p);
+            app->settings.pressure_unit = p;
         } else {
         } else {
             FURI_LOG_W(APP_NAME, "Unknown settings parameter: %s", buff);
             FURI_LOG_W(APP_NAME, "Unknown settings parameter: %s", buff);
         }
         }
@@ -197,7 +201,8 @@ static bool unitemp_alloc(void) {
 
 
     //Установка значений по умолчанию
     //Установка значений по умолчанию
     app->settings.infinityBacklight = true; //Подсветка горит всегда
     app->settings.infinityBacklight = true; //Подсветка горит всегда
-    app->settings.unit = CELSIUS; //Единица измерения - градусы Цельсия
+    app->settings.temp_unit = UT_TEMP_CELSIUS; //Единица измерения температуры - градусы Цельсия
+    app->settings.pressure_unit = UT_PRESSURE_MM_HG; //Единица измерения давления - мм рт. ст.
 
 
     app->gui = furi_record_open(RECORD_GUI);
     app->gui = furi_record_open(RECORD_GUI);
     //Диспетчер окон
     //Диспетчер окон

+ 28 - 7
unitemp.h

@@ -46,7 +46,7 @@
 //Имя файла с датчиками
 //Имя файла с датчиками
 #define APP_FILENAME_SENSORS "sensors.cfg"
 #define APP_FILENAME_SENSORS "sensors.cfg"
 //Версия приложения
 //Версия приложения
-#define UNITEMP_APP_VER "0.9 alfa"
+#define UNITEMP_APP_VER "0.91 alpha"
 
 
 //Размер буффера текста
 //Размер буффера текста
 #define BUFF_SIZE 32
 #define BUFF_SIZE 32
@@ -54,16 +54,25 @@
 #define UNITEMP_DEBUG
 #define UNITEMP_DEBUG
 
 
 /* Объявление перечислений */
 /* Объявление перечислений */
-//Единицы измерения
-typedef enum { CELSIUS, FAHRENHEIT } measureUnit;
-
+//Единицы измерения температуры
+typedef enum { UT_TEMP_CELSIUS, UT_TEMP_FAHRENHEIT, UT_TEMP_COUNT } tempMeasureUnit;
+//Единицы измерения давления
+typedef enum {
+    UT_PRESSURE_MM_HG,
+    UT_PRESSURE_IN_HG,
+    UT_PRESSURE_KPA,
+
+    UT_PRESSURE_COUNT
+} pressureMeasureUnit;
 /* Объявление структур */
 /* Объявление структур */
 //Настройки плагина
 //Настройки плагина
 typedef struct {
 typedef struct {
     //Бесконечная работа подсветки
     //Бесконечная работа подсветки
     bool infinityBacklight;
     bool infinityBacklight;
     //Единица измерения температуры
     //Единица измерения температуры
-    measureUnit unit;
+    tempMeasureUnit temp_unit;
+    //Единица измерения давления
+    pressureMeasureUnit pressure_unit;
     //Последнее состояние OTG
     //Последнее состояние OTG
     bool lastOTGState;
     bool lastOTGState;
 } UnitempSettings;
 } UnitempSettings;
@@ -103,13 +112,25 @@ typedef struct {
 void uintemp_celsiumToFarengate(Sensor* sensor);
 void uintemp_celsiumToFarengate(Sensor* sensor);
 
 
 /**
 /**
- * @brief Конвертация давления из паскалей в мм/рт
+ * @brief Конвертация давления из паскалей в мм рт.ст.
  * 
  * 
  * @param sensor Указатель на датчик
  * @param sensor Указатель на датчик
- * @return Давление в мм рт.ст.
  */
  */
 void unitemp_pascalToMmHg(Sensor* sensor);
 void unitemp_pascalToMmHg(Sensor* sensor);
 
 
+/**
+ * @brief Конвертация давления из паскалей в килопаскали
+ * 
+ * @param sensor Указатель на датчик
+ */
+void unitemp_pascalToKPa(Sensor* sensor);
+/**
+ * @brief Конвертация давления из паскалей в дюйм рт.ст.
+ * 
+ * @param sensor Указатель на датчик
+ */
+void unitemp_pascalToInHg(Sensor* sensor);
+
 /**
 /**
  * @brief Сохранение настроек на SD-карту
  * @brief Сохранение настроек на SD-карту
  * 
  * 

+ 26 - 5
views/General_view.c

@@ -53,7 +53,10 @@ static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t
 
 
     //Рисование иконки
     //Рисование иконки
     canvas_draw_icon(
     canvas_draw_icon(
-        canvas, x + 3, y + 3, (app->settings.unit == CELSIUS ? &I_temp_C_11x14 : &I_temp_F_11x14));
+        canvas,
+        x + 3,
+        y + 3,
+        (app->settings.temp_unit == UT_TEMP_CELSIUS ? &I_temp_C_11x14 : &I_temp_F_11x14));
 
 
     if((int16_t)sensor->temp == -128 || sensor->status == UT_SENSORSTATUS_TIMEOUT) {
     if((int16_t)sensor->temp == -128 || sensor->status == UT_SENSORSTATUS_TIMEOUT) {
         snprintf(app->buff, BUFF_SIZE, "--");
         snprintf(app->buff, BUFF_SIZE, "--");
@@ -125,12 +128,30 @@ static void _draw_pressure(Canvas* canvas, Sensor* sensor) {
     //Рисование иконки
     //Рисование иконки
     canvas_draw_icon(canvas, x + 3, y + 4, &I_pressure_7x13);
     canvas_draw_icon(canvas, x + 3, y + 4, &I_pressure_7x13);
 
 
-    //Давление
-    snprintf(app->buff, BUFF_SIZE, "%d", (uint16_t)sensor->pressure);
+    int16_t press_int = sensor->pressure;
+    int8_t press_dec = (int16_t)(sensor->temp * 10) % 10;
+
+    //Целая часть давления
+    snprintf(app->buff, BUFF_SIZE, "%d", press_int);
     canvas_set_font(canvas, FontBigNumbers);
     canvas_set_font(canvas, FontBigNumbers);
-    canvas_draw_str_aligned(canvas, x + 30, y + 10, AlignCenter, AlignCenter, app->buff);
+    canvas_draw_str_aligned(
+        canvas, x + 27 + ((press_int > 99) ? 5 : 0), y + 10, AlignCenter, AlignCenter, app->buff);
+    //Печать дробной части давления в диапазоне от 0 до 99 (когда два знака в числе)
+    if(press_int <= 99) {
+        uint8_t int_len = canvas_string_width(canvas, app->buff);
+        snprintf(app->buff, BUFF_SIZE, ".%d", press_dec);
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, x + 27 + int_len / 2 + 2, y + 10 + 7, app->buff);
+    }
+    canvas_set_font(canvas, FontSecondary);
     //Единица измерения
     //Единица измерения
-    canvas_draw_icon(canvas, x + 50, y + 3, &I_mm_hg_17x15);
+    if(app->settings.pressure_unit == UT_PRESSURE_MM_HG) {
+        canvas_draw_icon(canvas, x + 50, y + 2, &I_mm_hg_15x15);
+    } else if(app->settings.pressure_unit == UT_PRESSURE_IN_HG) {
+        canvas_draw_icon(canvas, x + 50, y + 2, &I_in_hg_15x15);
+    } else if(app->settings.pressure_unit == UT_PRESSURE_KPA) {
+        canvas_draw_str(canvas, x + 52, y + 13, "kPa");
+    }
 }
 }
 
 
 static void _draw_singleSensor(Canvas* canvas, Sensor* sensor, const uint8_t pos[2], Color color) {
 static void _draw_singleSensor(Canvas* canvas, Sensor* sensor, const uint8_t pos[2], Color color) {

+ 1 - 1
views/SensorEdit_view.c

@@ -46,7 +46,7 @@ bool _onewire_id_exist(uint8_t* id) {
     if(id == NULL) return false;
     if(id == NULL) return false;
     for(uint8_t i = 0; i < unitemp_sensors_getActiveCount(); i++) {
     for(uint8_t i = 0; i < unitemp_sensors_getActiveCount(); i++) {
         if(unitemp_sensor_getActive(i)->type == &Dallas) {
         if(unitemp_sensor_getActive(i)->type == &Dallas) {
-            if(unitemp_onewire_id_compare(
+            if(unitemp_onewire_id_coUT_PRESSURE_KPAre(
                    id, ((OneWireSensor*)(unitemp_sensor_getActive(i)->instance))->deviceID)) {
                    id, ((OneWireSensor*)(unitemp_sensor_getActive(i)->instance))->deviceID)) {
                 return true;
                 return true;
             }
             }

+ 24 - 6
views/Settings_view.c

@@ -24,12 +24,15 @@ static View* view;
 static VariableItemList* variable_item_list;
 static VariableItemList* variable_item_list;
 
 
 static const char states[2][9] = {"Auto", "Infinity"};
 static const char states[2][9] = {"Auto", "Infinity"};
-static const char units[2][3] = {"*C", "*F"};
+static const char temp_units[UT_TEMP_COUNT][3] = {"*C", "*F"};
+static const char pressure_units[UT_PRESSURE_COUNT][6] = {"mm Hg", "in Hg", "kPa"};
 
 
 //Элемент списка - бесконечная подсветка
 //Элемент списка - бесконечная подсветка
 VariableItem* infinity_backlight_item;
 VariableItem* infinity_backlight_item;
 //Единица измерения температуры
 //Единица измерения температуры
 VariableItem* temperature_unit_item;
 VariableItem* temperature_unit_item;
+//Единица измерения давления
+VariableItem* pressure_unit_item;
 #define VIEW_ID UnitempViewSettings
 #define VIEW_ID UnitempViewSettings
 
 
 /**
 /**
@@ -52,7 +55,8 @@ static uint32_t _exit_callback(void* context) {
 
 
     app->settings.infinityBacklight =
     app->settings.infinityBacklight =
         (bool)variable_item_get_current_value_index(infinity_backlight_item);
         (bool)variable_item_get_current_value_index(infinity_backlight_item);
-    app->settings.unit = (bool)variable_item_get_current_value_index(temperature_unit_item);
+    app->settings.temp_unit = variable_item_get_current_value_index(temperature_unit_item);
+    app->settings.pressure_unit = variable_item_get_current_value_index(pressure_unit_item);
     unitemp_saveSettings();
     unitemp_saveSettings();
     unitemp_loadSettings();
     unitemp_loadSettings();
 
 
@@ -79,7 +83,12 @@ static void _setting_change_callback(VariableItem* item) {
     if(item == temperature_unit_item) {
     if(item == temperature_unit_item) {
         variable_item_set_current_value_text(
         variable_item_set_current_value_text(
             temperature_unit_item,
             temperature_unit_item,
-            units[variable_item_get_current_value_index(temperature_unit_item)]);
+            temp_units[variable_item_get_current_value_index(temperature_unit_item)]);
+    }
+    if(item == pressure_unit_item) {
+        variable_item_set_current_value_text(
+            pressure_unit_item,
+            pressure_units[variable_item_get_current_value_index(pressure_unit_item)]);
     }
     }
 }
 }
 
 
@@ -92,9 +101,11 @@ void unitemp_Settings_alloc(void) {
     variable_item_list_reset(variable_item_list);
     variable_item_list_reset(variable_item_list);
 
 
     infinity_backlight_item = variable_item_list_add(
     infinity_backlight_item = variable_item_list_add(
-        variable_item_list, "Backlight time", 2, _setting_change_callback, app);
+        variable_item_list, "Backlight time", UT_TEMP_COUNT, _setting_change_callback, app);
     temperature_unit_item =
     temperature_unit_item =
         variable_item_list_add(variable_item_list, "Temp. unit", 2, _setting_change_callback, app);
         variable_item_list_add(variable_item_list, "Temp. unit", 2, _setting_change_callback, app);
+    pressure_unit_item = variable_item_list_add(
+        variable_item_list, "Press. unit", UT_PRESSURE_COUNT, _setting_change_callback, app);
 
 
     //Добавление колбека на нажатие средней кнопки
     //Добавление колбека на нажатие средней кнопки
     variable_item_list_set_enter_callback(variable_item_list, _enter_callback, app);
     variable_item_list_set_enter_callback(variable_item_list, _enter_callback, app);
@@ -117,10 +128,17 @@ void unitemp_Settings_switch(void) {
         infinity_backlight_item,
         infinity_backlight_item,
         states[variable_item_get_current_value_index(infinity_backlight_item)]);
         states[variable_item_get_current_value_index(infinity_backlight_item)]);
 
 
-    variable_item_set_current_value_index(temperature_unit_item, (uint8_t)app->settings.unit);
+    variable_item_set_current_value_index(temperature_unit_item, (uint8_t)app->settings.temp_unit);
     variable_item_set_current_value_text(
     variable_item_set_current_value_text(
         temperature_unit_item,
         temperature_unit_item,
-        units[variable_item_get_current_value_index(temperature_unit_item)]);
+        temp_units[variable_item_get_current_value_index(temperature_unit_item)]);
+
+    variable_item_set_current_value_index(
+        pressure_unit_item, (uint8_t)app->settings.pressure_unit);
+    variable_item_set_current_value_text(
+        pressure_unit_item,
+        pressure_units[variable_item_get_current_value_index(pressure_unit_item)]);
+
     view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_ID);
     view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_ID);
 }
 }