Преглед изворни кода

Added official firmware support

Victor пре 3 година
родитељ
комит
8f2e6da63d
8 измењених фајлова са 41 додато и 21 уклоњено
  1. 18 9
      Sensors.c
  2. 12 0
      Sensors.h
  3. 1 1
      interfaces/OneWireSensor.c
  4. 3 0
      unitemp.c
  5. 2 4
      unitemp.h
  6. 0 2
      views/MainMenu_view.c
  7. 2 2
      views/SensorEdit_view.c
  8. 3 3
      views/Summary_view.c

+ 18 - 9
Sensors.c

@@ -190,10 +190,20 @@ const GPIO* unitemp_gpio_getAviablePort(const Interface* interface, uint8_t inde
     return NULL;
 }
 
+uint8_t unitemp_sensors_getCount(void) {
+    if(app->sensors == NULL) return 0;
+    return sizeof(app->sensors) / sizeof(Sensor**);
+}
+
+void unitemp_sensors_add(Sensor* sensor) {
+    app->sensors =
+        (Sensor**)realloc(app->sensors, (unitemp_sensors_getCount() + 1) * sizeof(Sensor*));
+    app->sensors[unitemp_sensors_getCount()] = sensor;
+}
+
 bool unitemp_sensors_load(void) {
     FURI_LOG_D(APP_NAME, "Loading sensors...");
-    app->sensors_count = 0;
-    memset(app->sensors, 0, sizeof(app->sensors));
+    //memset(app->sensors, 0, (unitemp_sensors_getCount() + 1) * sizeof(Sensor*));
 
     //Выделение памяти на поток
     app->file_stream = file_stream_alloc(app->storage);
@@ -275,7 +285,7 @@ bool unitemp_sensors_load(void) {
             Sensor* sensor =
                 unitemp_sensor_alloc(name, unitemp_sensors_getTypeFromStr(type), args);
             if(sensor != NULL) {
-                app->sensors[app->sensors_count++] = sensor;
+                unitemp_sensors_add(sensor);
             } else {
                 FURI_LOG_E(APP_NAME, "Failed sensor (%s:%s) mem allocation", name, type);
             }
@@ -320,7 +330,7 @@ bool unitemp_sensors_save(void) {
     }
 
     //Сохранение датчиков
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(app->sensors[i]->type->interface == &SINGLE_WIRE) {
             stream_write_format(
                 app->file_stream,
@@ -440,10 +450,9 @@ void unitemp_sensor_free(Sensor* sensor) {
 }
 
 void unitemp_sensors_free(void) {
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         unitemp_sensor_free(app->sensors[i]);
     }
-    app->sensors_count = 0;
     free(app->sensors);
 }
 
@@ -451,7 +460,7 @@ bool unitemp_sensors_init(void) {
     bool result = true;
 
     //Перебор датчиков из списка
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         //Включение 5V если на порту 1 FZ его нет
         //Может пропасть при отключении USB
         if(furi_hal_power_is_otg_enabled() != true) {
@@ -480,7 +489,7 @@ bool unitemp_sensors_deInit(void) {
     }
 
     //Перебор датчиков из списка
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(!(*app->sensors[i]->type->deinitializer)(app->sensors[i])) {
             FURI_LOG_E(
                 APP_NAME,
@@ -519,7 +528,7 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) {
 }
 
 void unitemp_sensors_updateValues(void) {
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         unitemp_sensor_updateData(app->sensors[i]);
     }
 }

+ 12 - 0
Sensors.h

@@ -162,6 +162,18 @@ void unitemp_sensors_free(void);
  */
 void unitemp_sensors_updateValues(void);
 
+/**
+ * @brief Получить количество загруженных датчиков
+ * @return Количество датчиков
+ */
+uint8_t unitemp_sensors_getCount(void);
+
+/**
+ * @brief Добавить датчик в общий список
+ * @param sensor Указатель на датчик
+ */
+void unitemp_sensors_add(Sensor* sensor);
+
 /**
 * @brief Получить списк доступных типов датчиков
 * @return Указатель на список датчиков

+ 1 - 1
interfaces/OneWireSensor.c

@@ -27,7 +27,7 @@ OneWireBus* uintemp_onewire_bus_alloc(const GPIO* gpio) {
     }
 
     //Проверка на наличие шины на этом порте
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(app->sensors[i]->type->interface == &ONE_WIRE &&
            ((OneWireSensor*)app->sensors[i]->instance)->bus->gpio->num == gpio->num) {
             //Если шина на этом порту уже есть, то возврат указателя на шину

+ 3 - 0
unitemp.c

@@ -8,6 +8,7 @@
 
 //TODO: Реализовать ограничение на добавление датчиков если интерфейс недоступен
 //TODO: Не выкидывать датчик в ошибку при первом же неудачном опросе
+//TODO: Динамический размер массива с датчиками
 
 /* Переменные */
 //Данные приложения
@@ -183,6 +184,8 @@ static bool unitemp_alloc(void) {
     //Диспетчер окон
     app->view_dispatcher = view_dispatcher_alloc();
 
+    app->sensors = NULL;
+
     unitemp_Summary_alloc();
     unitemp_MainMenu_alloc();
     unitemp_Settings_alloc();

+ 2 - 4
unitemp.h

@@ -52,10 +52,8 @@ typedef struct {
     bool sensors_ready; //Флаг готовности датчиков к опросу
     //Основные настройки
     UnitempSettings settings;
-    //Список указателей на датчики
-    Sensor* sensors[MAX_SENSORS];
-    //Количество загруженных датчиков
-    uint8_t sensors_count;
+    //Массив указателей на датчики
+    Sensor** sensors;
 
     //SD-карта
     Storage* storage; //Хранилище

+ 0 - 2
views/MainMenu_view.c

@@ -28,8 +28,6 @@ static uint32_t _exit_callback(void* context) {
 static void _enter_callback(void* context, uint32_t index) {
     UNUSED(context);
     if(index == 0) { //add new sensor
-        //TODO: сообщение о максимальном количестве датчиков
-        if(app->sensors_count >= MAX_SENSORS) return;
         unitemp_SensorsList_switch();
     }
     if(index == 1) { //Settings

+ 2 - 2
views/SensorEdit_view.c

@@ -23,7 +23,7 @@ static VariableItem* onewire_type_item;
 
 bool _onewire_id_exist(uint8_t* id) {
     if(id == NULL) return false;
-    for(uint8_t i = 0; i < app->sensors_count; i++) {
+    for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
         if(app->sensors[i]->type == &DS18x2x) {
             if(unitemp_onewire_id_compare(
                    id, ((OneWireSensor*)(app->sensors[i]->instance))->deviceID)) {
@@ -145,7 +145,7 @@ static void _enter_callback(void* context, uint32_t index) {
            ((OneWireSensor*)(editable_sensor->instance))->familyCode == 0) {
             return;
         }
-        app->sensors[app->sensors_count++] = editable_sensor;
+        unitemp_sensors_add(editable_sensor);
         unitemp_sensors_save();
         unitemp_sensors_reload();
 

+ 3 - 3
views/Summary_view.c

@@ -14,8 +14,8 @@ static void _draw_callback(Canvas* canvas, void* _model) {
     canvas_draw_str_aligned(canvas, 64, 7, AlignCenter, AlignCenter, "Unitemp");
 
     canvas_set_color(canvas, ColorBlack);
-    if(app->sensors_count > 0) {
-        for(uint8_t i = 0; i < app->sensors_count; i++) {
+    if(unitemp_sensors_getCount() > 0) {
+        for(uint8_t i = 0; i < unitemp_sensors_getCount(); i++) {
             canvas_set_font(canvas, FontPrimary);
             canvas_draw_str(canvas, 0, 24 + 10 * i, app->sensors[i]->name);
 
@@ -41,7 +41,7 @@ static void _draw_callback(Canvas* canvas, void* _model) {
         }
     } else {
         canvas_set_font(canvas, FontSecondary);
-        if(app->sensors_count == 0) canvas_draw_str(canvas, 0, 24, "Sensors not found");
+        if(unitemp_sensors_getCount() == 0) canvas_draw_str(canvas, 0, 24, "Sensors not found");
     }
 }