/* * Developed by TComLab * Version: v0.1 * Date: 2025-12-15 */ #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "dcdc_controller.h" #include "ina226_monitor.h" #include "uart_mux.h" #include "usb_cdc_log.h" #include "ws2812_status.h" static const char *TAG = "watch-watch"; static const char HB_MESSAGE[] = "{\"hb\":1}\r\n"; void app_main(void) { if (usb_cdc_log_init() != ESP_OK) { ESP_LOGW(TAG, "USB CDC лог недоступний"); } else { ESP_LOGI(TAG, "USB CDC лог активовано"); } vTaskDelay(pdMS_TO_TICKS(2000)); // Затримка для стабілізації живлення після перезавантаження ESP_LOGI(TAG, "Запуск watch-watch systems"); if (dcdc_init() != ESP_OK) { ESP_LOGE(TAG, "Помилка ініціалізації DCDC контролера"); ws2812_status_init(); ws2812_status_set_error(true); return; } if (ws2812_status_init() == ESP_OK) { ws2812_status_refresh_from_dcdc(); esp_err_t anim_err = ws2812_status_play_bringup_animation(1, 120); if (anim_err != ESP_OK) { ESP_LOGW(TAG, "Анімація WS2812 недоступна: %s", esp_err_to_name(anim_err)); } } else { ESP_LOGW(TAG, "WS2812 статусний індикатор недоступний"); } if (ina226_monitor_init() == ESP_OK) { ESP_LOGI(TAG, "INA226 моніторинг активовано"); ina226_monitor_sample(NULL); } else { ESP_LOGW(TAG, "Моніторинг навантаження недоступний"); } if (uart_mux_init() == ESP_OK) { ESP_LOGI(TAG, "UART мультиплексор активовано"); } else { ESP_LOGW(TAG, "UART мультиплексор недоступний"); } ESP_LOGI(TAG, "Початок послідовного ввімкнення каналів з інтервалом 4 с"); const TickType_t on_time = pdMS_TO_TICKS(4000); while (true) { for (size_t ch = 0; ch < dcdc_channel_count(); ++ch) { if (!dcdc_get_state(ch)) { ESP_LOGI(TAG, "-> Ввімкнення каналу %d", (int)ch); dcdc_enable(ch); ws2812_status_set_channel_state(ch, true); } ws2812_status_mark_active(ch); vTaskDelay(on_time); ina226_reading_t reading = {0}; if (ina226_monitor_sample(&reading) == ESP_OK) { ESP_LOGI(TAG, "Живлення: %.2f В, %.1f мА, %.1f мВт", reading.voltage_v, reading.current_ma, reading.power_mw); } if (uart_mux_ready()) { if (uart_mux_write(ch, (const uint8_t *)HB_MESSAGE, sizeof(HB_MESSAGE) - 1, pdMS_TO_TICKS(100)) != ESP_OK) { ESP_LOGW(TAG, "Не вдалося надіслати heartbeat на канал %d", (int)ch); } } } } }