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

Added sensors temperature offset

Victor 3 лет назад
Родитель
Сommit
42cb56ea83
3 измененных файлов с 50 добавлено и 17 удалено
  1. 17 14
      Sensors.c
  2. 2 0
      Sensors.h
  3. 31 3
      views/SensorEdit_view.c

+ 17 - 14
Sensors.c

@@ -336,10 +336,12 @@ bool unitemp_sensors_load(void) {
         char name[11] = {0};
         //Тип датчика
         char type[11] = {0};
+        //Смещение по температуре
+        int temp_offset = 0;
         //Смещение по строке для отделения аргументов
         int offset = 0;
         //Чтение из строки
-        sscanf(((char*)(file_buf + line_end)), "%s %s %n", name, type, &offset);
+        sscanf(((char*)(file_buf + line_end)), "%s %s %d %n", name, type, &temp_offset, &offset);
         //Ограничение длины имени
         name[10] = '\0';
 
@@ -356,6 +358,7 @@ bool unitemp_sensors_load(void) {
             Sensor* sensor =
                 unitemp_sensor_alloc(name, unitemp_sensors_getTypeFromStr(type), args);
             if(sensor != NULL) {
+                sensor->temp_offset = temp_offset;
                 unitemp_sensors_add(sensor);
             } else {
                 FURI_LOG_E(APP_NAME, "Failed sensor (%s:%s) mem allocation", name, type);
@@ -409,28 +412,26 @@ bool unitemp_sensors_save(void) {
         for(uint8_t i = 0; i < 10; i++) {
             if(sensor->name[i] == ' ') sensor->name[i] = '?';
         }
+
+        stream_write_format(
+            app->file_stream,
+            "%s %s %d ",
+            sensor->name,
+            sensor->type->typename,
+            sensor->temp_offset);
+
         if(sensor->type->interface == &SINGLE_WIRE) {
             stream_write_format(
-                app->file_stream,
-                "%s %s %d\n",
-                sensor->name,
-                sensor->type->typename,
-                unitemp_singlewire_sensorGetGPIO(sensor)->num);
+                app->file_stream, "%d\n", unitemp_singlewire_sensorGetGPIO(sensor)->num);
         }
         if(sensor->type->interface == &I2C) {
             stream_write_format(
-                app->file_stream,
-                "%s %s %X\n",
-                sensor->name,
-                sensor->type->typename,
-                ((I2CSensor*)sensor->instance)->currentI2CAdr);
+                app->file_stream, "%X\n", ((I2CSensor*)sensor->instance)->currentI2CAdr);
         }
         if(sensor->type->interface == &ONE_WIRE) {
             stream_write_format(
                 app->file_stream,
-                "%s %s %d %02X%02X%02X%02X%02X%02X%02X%02X\n",
-                sensor->name,
-                sensor->type->typename,
+                "%d %02X%02X%02X%02X%02X%02X%02X%02X\n",
                 ((OneWireSensor*)sensor->instance)->bus->gpio->num,
                 ((OneWireSensor*)sensor->instance)->deviceID[0],
                 ((OneWireSensor*)sensor->instance)->deviceID[1],
@@ -494,6 +495,7 @@ Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, char* args) {
     sensor->temp = -128.0f;
     sensor->hum = -128.0f;
     sensor->pressure = -128.0f;
+    sensor->temp_offset = 0;
     //Выделение памяти под инстанс датчика в зависимости от его интерфейса
     status = sensor->type->interface->allocator(sensor, args);
 
@@ -624,6 +626,7 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) {
     if(app->settings.temp_unit == UT_TEMP_FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK)
         uintemp_celsiumToFarengate(sensor);
     if(sensor->status == UT_SENSORSTATUS_OK) {
+        sensor->temp += sensor->temp_offset / 10.f;
         if(app->settings.pressure_unit == UT_PRESSURE_MM_HG) {
             unitemp_pascalToMmHg(sensor);
         } else if(app->settings.pressure_unit == UT_PRESSURE_IN_HG) {

+ 2 - 0
Sensors.h

@@ -127,6 +127,8 @@ typedef struct Sensor {
     UnitempStatus status;
     //Время последнего опроса датчика
     uint32_t lastPollingTime;
+    //Смещение по температуре (x10)
+    int8_t temp_offset;
     //Экземпляр датчика
     void* instance;
 } Sensor;

+ 31 - 3
views/SensorEdit_view.c

@@ -37,6 +37,12 @@ static VariableItem* sensor_name_item;
 static VariableItem* onewire_addr_item;
 //Элемент списка - адрес датчика one wire
 static VariableItem* onewire_type_item;
+//Элемент списка - смещение температуры
+VariableItem* temp_offset_item;
+
+#define OFFSET_BUFF_SIZE 5
+//Буффер для текста смещения
+static char* offset_buff;
 
 extern uint8_t generalview_sensor_index;
 
@@ -154,8 +160,8 @@ static void _enter_callback(void* context, uint32_t index) {
         unitemp_SensorNameEdit_switch(editable_sensor);
     }
     //Сохранение
-    if((index == 3 && editable_sensor->type->interface != &ONE_WIRE) ||
-       (index == 4 && editable_sensor->type->interface == &ONE_WIRE)) {
+    if((index == 4 && editable_sensor->type->interface != &ONE_WIRE) ||
+       (index == 5 && editable_sensor->type->interface == &ONE_WIRE)) {
         //Выход если датчик one wire не имеет ID
         if(editable_sensor->type->interface == &ONE_WIRE &&
            ((OneWireSensor*)(editable_sensor->instance))->familyCode == 0) {
@@ -175,7 +181,7 @@ static void _enter_callback(void* context, uint32_t index) {
     }
 
     //Адрес устройства на шине one wire
-    if(index == 3 && editable_sensor->type->interface == &ONE_WIRE) {
+    if(index == 4 && editable_sensor->type->interface == &ONE_WIRE) {
         _onewire_scan();
     }
 }
@@ -232,6 +238,18 @@ static void _onwire_addr_change_callback(VariableItem* item) {
     _onewire_scan();
 }
 
+/**
+ * @brief Функция обработки изменения значения смещения температуры
+ * 
+ * @param item Указатель на элемент списка
+ */
+static void _offset_change_callback(VariableItem* item) {
+    editable_sensor->temp_offset = variable_item_get_current_value_index(item) - 20;
+    snprintf(
+        offset_buff, OFFSET_BUFF_SIZE, "%+1.1f", (double)(editable_sensor->temp_offset / 10.0));
+    variable_item_set_current_value_text(item, offset_buff);
+}
+
 /**
  * @brief Создание меню редактирования датчка
  */
@@ -249,6 +267,8 @@ void unitemp_SensorEdit_alloc(void) {
     view_set_previous_callback(view, _exit_callback);
     //Добавление вида в диспетчер
     view_dispatcher_add_view(app->view_dispatcher, VIEW_ID, view);
+
+    offset_buff = malloc(OFFSET_BUFF_SIZE);
 }
 
 void unitemp_SensorEdit_switch(Sensor* sensor) {
@@ -274,6 +294,13 @@ void unitemp_SensorEdit_switch(Sensor* sensor) {
         onewire_type_item,
         (sensor->type->interface == &ONE_WIRE ? unitemp_onewire_sensor_getModel(editable_sensor) :
                                                 sensor->type->typename));
+    //Смещение температуры
+    temp_offset_item = variable_item_list_add(
+        variable_item_list, "Temp. offset", 41, _offset_change_callback, NULL);
+    variable_item_set_current_value_index(temp_offset_item, sensor->temp_offset + 20);
+    snprintf(
+        offset_buff, OFFSET_BUFF_SIZE, "%+1.1f", (double)(editable_sensor->temp_offset / 10.0));
+    variable_item_set_current_value_text(temp_offset_item, offset_buff);
 
     //Порт подключения датчка (для one wire и single wire)
     if(sensor->type->interface == &ONE_WIRE || sensor->type->interface == &SINGLE_WIRE) {
@@ -345,4 +372,5 @@ void unitemp_SensorEdit_free(void) {
     view_free(view);
     //Удаление вида после обработки
     view_dispatcher_remove_view(app->view_dispatcher, VIEW_ID);
+    free(offset_buff);
 }