ソースを参照

Exclusion of sensors with incorrect parameters, small improvements

Victor 3 年 前
コミット
fc18e66bf4
5 ファイル変更39 行追加31 行削除
  1. 2 1
      Sensors.c
  2. 28 16
      interfaces/OneWireSensor.c
  3. 6 6
      interfaces/OneWireSensor.h
  4. 0 5
      unitemp.c
  5. 3 3
      views/SensorEdit_view.c

+ 2 - 1
Sensors.c

@@ -269,8 +269,9 @@ bool unitemp_sensors_load(void) {
         FURI_LOG_D(APP_NAME, "%s %s", name, type);
 
         char* args = ((char*)(file_buf + line_end + offset));
+        const SensorType* stype = unitemp_sensors_getTypeFromStr(type);
         //Проверка типа датчика
-        if(sizeof(name) <= 11) {
+        if(stype != NULL && sizeof(name) > 0 && sizeof(name) <= 11) {
             Sensor* sensor =
                 unitemp_sensor_alloc(name, unitemp_sensors_getTypeFromStr(type), args);
             if(sensor != NULL) {

+ 28 - 16
interfaces/OneWireSensor.c

@@ -99,7 +99,7 @@ bool unitemp_onewire_bus_start(OneWireBus* bus) {
     return status;
 }
 
-void unitemp_onewire_send_bit(OneWireBus* bus, bool state) {
+void unitemp_onewire_bus_send_bit(OneWireBus* bus, bool state) {
     if(state) {
         // write 1
         furi_hal_gpio_write(bus->gpio->pin, false);
@@ -121,7 +121,7 @@ void unitemp_onewire_send_bit(OneWireBus* bus, bool state) {
 
 void unitemp_onewire_bus_send_byte(OneWireBus* bus, uint8_t data) {
     for(int i = 0; i < 8; i++) {
-        unitemp_onewire_send_bit(bus, (data & (1 << i)) != 0);
+        unitemp_onewire_bus_send_bit(bus, (data & (1 << i)) != 0);
     }
 }
 
@@ -131,7 +131,7 @@ void unitemp_onewire_bus_send_byteArray(OneWireBus* bus, uint8_t* data, uint8_t
     }
 }
 
-bool unitemp_onewire_read_bit(OneWireBus* bus) {
+bool unitemp_onewire_bus_read_bit(OneWireBus* bus) {
     furi_hal_gpio_write(bus->gpio->pin, false);
     furi_delay_us(2); // Длительность низкого уровня, минимум 1 мкс
     furi_hal_gpio_write(bus->gpio->pin, true);
@@ -141,18 +141,18 @@ bool unitemp_onewire_read_bit(OneWireBus* bus) {
     return r;
 }
 
-uint8_t unitemp_onewire_read_byte(OneWireBus* bus) {
+uint8_t unitemp_onewire_bus_read_byte(OneWireBus* bus) {
     uint8_t r = 0;
     for(uint8_t p = 8; p; p--) {
         r >>= 1;
-        if(unitemp_onewire_read_bit(bus)) r |= 0x80;
+        if(unitemp_onewire_bus_read_bit(bus)) r |= 0x80;
     }
     return r;
 }
 
-void unitemp_onewire_read_byteArray(OneWireBus* bus, uint8_t* data, uint8_t len) {
+void unitemp_onewire_bus_read_byteArray(OneWireBus* bus, uint8_t* data, uint8_t len) {
     for(uint8_t i = 0; i < len; i++) {
-        data[i] = unitemp_onewire_read_byte(bus);
+        data[i] = unitemp_onewire_bus_read_byte(bus);
     }
 }
 
@@ -175,7 +175,7 @@ bool unitemp_onewire_CRC_check(uint8_t* data, uint8_t len) {
 bool unitemp_onewire_sensor_readID(OneWireSensor* instance) {
     if(!unitemp_onewire_bus_start(instance->bus)) return false;
     unitemp_onewire_bus_send_byte(instance->bus, 0x33); // Чтение ПЗУ
-    unitemp_onewire_read_byteArray(instance->bus, instance->deviceID, 8);
+    unitemp_onewire_bus_read_byteArray(instance->bus, instance->deviceID, 8);
     if(!unitemp_onewire_CRC_check(instance->deviceID, 8)) {
         memset(instance->deviceID, 0, 8);
         return false;
@@ -184,14 +184,14 @@ bool unitemp_onewire_sensor_readID(OneWireSensor* instance) {
     return true;
 }
 
-void unitemp_onewire_enum_init(void) {
+void unitemp_onewire_bus_enum_init(void) {
     for(uint8_t p = 0; p < 8; p++) {
         onewire_enum[p] = 0;
     }
     onewire_enum_fork_bit = 65; // правее правого
 }
 
-uint8_t* unitemp_onewire_enum_next(OneWireBus* bus) {
+uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus) {
     furi_delay_ms(10);
     if(!onewire_enum_fork_bit) { // Если на предыдущем шаге уже не было разногласий
         FURI_LOG_D(APP_NAME, "All devices on wire %d is found", unitemp_gpio_toInt(bus->gpio));
@@ -210,8 +210,8 @@ uint8_t* unitemp_onewire_enum_next(OneWireBus* bus) {
     unitemp_onewire_bus_send_byte(bus, 0xF0);
     uint8_t newfork = 0;
     for(;;) {
-        uint8_t not0 = unitemp_onewire_read_bit(bus);
-        uint8_t not1 = unitemp_onewire_read_bit(bus);
+        uint8_t not0 = unitemp_onewire_bus_read_bit(bus);
+        uint8_t not1 = unitemp_onewire_bus_read_bit(bus);
         if(!not0) { // Если присутствует в адресах бит ноль
             if(!not1) { // Но также присустствует бит 1 (вилка)
                 if(p <
@@ -236,7 +236,7 @@ uint8_t* unitemp_onewire_enum_next(OneWireBus* bus) {
                 return 0;
             }
         }
-        unitemp_onewire_send_bit(bus, next & 0x80);
+        unitemp_onewire_bus_send_bit(bus, next & 0x80);
         bp--;
         if(!bp) {
             *pprev = next;
@@ -359,7 +359,20 @@ bool unitemp_onewire_sensor_deinit(Sensor* sensor) {
 
 UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) {
     OneWireSensor* instance = sensor->instance;
+    uint8_t buff[9] = {0};
     if(sensor->status != UT_POLLING) {
+        //Если датчик в прошлый раз не отозвался, проверка его наличия на шине
+        if(sensor->status == UT_TIMEOUT || sensor->status == UT_BADCRC) {
+            if(!unitemp_onewire_bus_start(instance->bus)) return UT_TIMEOUT;
+            unitemp_onewire_bus_select_sensor(instance);
+            unitemp_onewire_bus_send_byte(instance->bus, 0xBE); // Read Scratch-pad
+            unitemp_onewire_bus_read_byteArray(instance->bus, buff, 9);
+            if(!unitemp_onewire_CRC_check(buff, 9)) {
+                FURI_LOG_D(APP_NAME, "Sensor %s is not found", sensor->name);
+                return UT_TIMEOUT;
+            }
+        }
+
         if(!unitemp_onewire_bus_start(instance->bus)) return UT_TIMEOUT;
         unitemp_onewire_bus_select_sensor(instance);
         unitemp_onewire_bus_send_byte(instance->bus, 0x44); // convert t
@@ -378,11 +391,10 @@ UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) {
         if(!unitemp_onewire_bus_start(instance->bus)) return UT_TIMEOUT;
         unitemp_onewire_bus_select_sensor(instance);
         unitemp_onewire_bus_send_byte(instance->bus, 0xBE); // Read Scratch-pad
-        uint8_t buff[9];
-        unitemp_onewire_read_byteArray(instance->bus, buff, 9);
+        unitemp_onewire_bus_read_byteArray(instance->bus, buff, 9);
         if(!unitemp_onewire_CRC_check(buff, 9)) {
             FURI_LOG_D(APP_NAME, "Failed CRC check: %s", sensor->name);
-            return UT_TIMEOUT;
+            return UT_BADCRC;
         }
         int16_t raw = buff[0] | ((int16_t)buff[1] << 8);
         if(instance->familyCode == FC_DS18S20) {

+ 6 - 6
interfaces/OneWireSensor.h

@@ -106,7 +106,7 @@ bool unitemp_onewire_bus_start(OneWireBus* bus);
  * @param bus Указатель на шину
  * @param state Логический уровень
  */
-void unitemp_onewire_send_bit(OneWireBus* bus, bool state);
+void unitemp_onewire_bus_send_bit(OneWireBus* bus, bool state);
 
 /**
  * @brief Запись байта на шину one wire
@@ -131,7 +131,7 @@ void unitemp_onewire_bus_send_byteArray(OneWireBus* bus, uint8_t* data, uint8_t
  * @param bus Указатель на шину one wire
  * @return Логический уровень бита
  */
-bool unitemp_oneWire_read_bit(OneWireBus* bus);
+bool unitemp_onewire_bus_read_bit(OneWireBus* bus);
 
 /**
  * @brief Чтение байта с шины One Wire
@@ -139,7 +139,7 @@ bool unitemp_oneWire_read_bit(OneWireBus* bus);
  * @param bus Указатель на шину one wire
  * @return Байт информации
  */
-uint8_t unitemp_onewire_read_byte(OneWireBus* bus);
+uint8_t unitemp_onewire_bus_read_byte(OneWireBus* bus);
 
 /**
  * @brief Чтение массива байт с шины One Wire
@@ -148,7 +148,7 @@ uint8_t unitemp_onewire_read_byte(OneWireBus* bus);
  * @param data Указатель на массив, куда будут записаны данные
  * @param len Количество байт
  */
-void unitemp_onewire_read_byteArray(OneWireBus* bus, uint8_t* data, uint8_t len);
+void unitemp_onewire_bus_read_byteArray(OneWireBus* bus, uint8_t* data, uint8_t len);
 
 /**
  * @brief Проверить контрольную сумму массива данных
@@ -176,14 +176,14 @@ void unitemp_onewire_bus_select_sensor(OneWireSensor* instance);
 /**
  * @brief Инициализация процесса поиска адресов на шине one wire
  */
-void unitemp_onewire_enum_init(void);
+void unitemp_onewire_bus_enum_init(void);
 
 /**
  * @brief Перечисляет устройства на шине one wire и получает очередной адрес
  * @param bus Указатель на шину one wire
  * @return Возвращает указатель на буфер, содержащий восьмибайтовое значение адреса, либо NULL, если поиск завешён
  */
-uint8_t* unitemp_onewire_enum_next(OneWireBus* bus);
+uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus);
 
 /**
  * @brief Сравнить ID датчиков

+ 0 - 5
unitemp.c

@@ -7,12 +7,7 @@
 #include <m-string.h>
 
 //TODO: Реализовать ограничение на добавление датчиков если интерфейс недоступен
-//TODO: Исключить добавление датчиков DS18x2x с одинаковыми ID
-//TODO: Проверка корректности параметров датчика перед аллокацией
 //TODO: Не выкидывать датчик в ошибку при первом же неудачном опросе
-//TODO: Запускать преобразование DS18x2x разом, затем поочерёдно считывать
-//TODO: При выходе из меню добавления DS18x2x полностью отваливается шина, исправить
-//TODO: Мигание DS18x2x при его отсутствии на шине
 
 /* Переменные */
 //Данные приложения

+ 3 - 3
views/SensorEdit_view.c

@@ -43,14 +43,14 @@ static void _onewire_scan(void) {
         ow_sensor->bus->device_count);
     //Сканирование шины one wire
     unitemp_onewire_bus_init(ow_sensor->bus);
-    unitemp_onewire_enum_init();
+    unitemp_onewire_bus_enum_init();
     uint8_t* id;
     do {
-        id = unitemp_onewire_enum_next(ow_sensor->bus);
+        id = unitemp_onewire_bus_enum_next(ow_sensor->bus);
     } while(_onewire_id_exist(id));
 
     if(id == NULL) {
-        id = unitemp_onewire_enum_next(ow_sensor->bus);
+        id = unitemp_onewire_bus_enum_next(ow_sensor->bus);
         if(id == NULL || _onewire_id_exist(id)) {
             memset(ow_sensor->deviceID, 0, 8);
             ow_sensor->familyCode = 0;