Files
arcs/arcs-sdk/components/acomp/logger/acomp_logger_example.c
2026-08-13 16:50:52 +08:00

268 lines
6.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* SPDX-License-Identifier: Apache-2.0
*
* ACOMP Logger 使用示例
*
* 展示如何在 Master 端启用和使用日志传输功能。
* Logger 组件通过 R2M 流从 Remote (AP) 端接收日志并输出到 Master 端。
*/
#include "acomp_logger.h"
#define TAG "logger_example"
#include "lisa_log.h"
/**
* @brief 基础使用示例
*
* 这是最简单的使用方式只需两步init 和 start
*
* acomp_logger_start() 会自动完成:
* - 根据 Kconfig 配置 R2M 流通道(缓冲区大小和数量)
* - 启动 Remote 端的日志捕获
* - 创建接收线程(根据触发策略工作)
* - 自动接收并输出日志
*/
int acomp_logger_example_init(void)
{
int ret;
/* 步骤 1: 初始化 logger 组件 */
ret = acomp_logger_init();
if (ret != ACOMP_ERR_OK) {
LISA_LOGE(TAG, "Failed to initialize logger: %d", ret);
return ret;
}
/* 步骤 2: 启动 logger 组件 */
ret = acomp_logger_start();
if (ret != ACOMP_ERR_OK) {
LISA_LOGE(TAG, "Failed to start logger: %d", ret);
return ret;
}
LISA_LOGI(TAG, "Logger started successfully!");
LISA_LOGI(TAG, "Remote logs will now be displayed automatically");
return ACOMP_ERR_OK;
}
/**
* @brief 停止日志传输
*
* 停止 logger 组件会自动:
* - 停止接收线程
* - 停止 Remote 端的日志捕获
* - 禁用并清理 R2M 流通道
*/
int acomp_logger_example_deinit(void)
{
int ret;
/* 停止 logger 组件 */
ret = acomp_logger_stop();
if (ret != ACOMP_ERR_OK) {
LISA_LOGW(TAG, "Failed to stop logger: %d", ret);
return ret;
}
LISA_LOGI(TAG, "Logger stopped successfully");
return ACOMP_ERR_OK;
}
/**
* @brief 完整示例:初始化、运行、停止
*
* 这个示例展示了 logger 组件的完整生命周期
*/
int acomp_logger_example_full(void)
{
int ret;
LISA_LOGI(TAG, "=== ACOMP Logger Full Example ===");
/* 初始化 */
ret = acomp_logger_example_init();
if (ret != ACOMP_ERR_OK) {
return ret;
}
/*
* 应用程序主循环
* 在这期间Remote 端的日志会自动显示
*/
LISA_LOGI(TAG, "Logger is running...");
LISA_LOGI(TAG, "You should now see Remote logs appearing");
/* 模拟运行一段时间 */
for (int i = 0; i < 10; i++) {
LISA_LOGI(TAG, "Main loop iteration %d", i);
vTaskDelay(pdMS_TO_TICKS(1000));
}
/* 停止 logger */
LISA_LOGI(TAG, "Stopping logger...");
ret = acomp_logger_example_deinit();
if (ret != ACOMP_ERR_OK) {
return ret;
}
LISA_LOGI(TAG, "=== Example completed ===");
return ACOMP_ERR_OK;
}
/**
* @brief 错误处理示例
*
* 展示如何处理 logger API 的错误返回值
*/
int acomp_logger_example_with_error_handling(void)
{
int ret;
/* 初始化 logger */
ret = acomp_logger_init();
switch (ret) {
case ACOMP_ERR_OK:
LISA_LOGI(TAG, "Logger initialized");
break;
case ACOMP_ERR_NO_MEM:
LISA_LOGE(TAG, "Initialization failed: Out of memory");
return ret;
case ACOMP_ERR_INVALID_STATE:
LISA_LOGE(TAG, "Initialization failed: Invalid state");
return ret;
case ACOMP_ERR_NOT_FOUND:
LISA_LOGE(TAG, "Initialization failed: Logger device not found");
return ret;
default:
LISA_LOGE(TAG, "Initialization failed: Unknown error %d", ret);
return ret;
}
/* 启动 logger */
ret = acomp_logger_start();
switch (ret) {
case ACOMP_ERR_OK:
LISA_LOGI(TAG, "Logger started");
break;
case ACOMP_ERR_NO_MEM:
LISA_LOGE(TAG, "Start failed: Out of memory");
goto cleanup;
case ACOMP_ERR_INVALID_STATE:
LISA_LOGE(TAG, "Start failed: Invalid state (already started?)");
goto cleanup;
default:
LISA_LOGE(TAG, "Start failed: Unknown error %d", ret);
goto cleanup;
}
LISA_LOGI(TAG, "Logger running normally");
/* 应用程序运行... */
vTaskDelay(pdMS_TO_TICKS(5000));
/* 停止 logger */
ret = acomp_logger_stop();
if (ret != ACOMP_ERR_OK) {
LISA_LOGW(TAG, "Stop returned error: %d (continuing anyway)", ret);
}
return ACOMP_ERR_OK;
cleanup:
/* 清理资源 */
acomp_logger_stop();
return ret;
}
/**
* @brief 自定义日志输出回调示例
*
* 展示如何使用自定义回调函数来控制 AP 日志的输出方式
*/
/* 自定义日志输出函数 - 输出到 printf */
static int custom_log_output_printf(const uint8_t *log, uint32_t len)
{
printf("[AP] %.*s", len, log);
return 0;
}
/* 自定义日志输出函数 - 带颜色高亮 */
static int custom_log_output_with_color(const uint8_t *log, uint32_t len)
{
/* 使用 ANSI 颜色码:青色背景 + 黑色文字 */
printf("\033[46m\033[30m[AP]\033[0m %.*s", len, log);
return 0;
}
/* 自定义日志输出函数 - 写入文件 */
static int custom_log_output_to_file(const uint8_t *log, uint32_t len)
{
/* 这里可以实现写入文件的逻辑 */
/* 例如: fwrite(log, 1, len, log_file); */
LISA_LOGI(TAG, "[AP->FILE] %.*s", len, log);
return 0;
}
int acomp_logger_example_with_custom_output(void)
{
int ret;
LISA_LOGI(TAG, "=== Custom Output Callback Example ===");
/* 初始化 logger */
ret = acomp_logger_init();
if (ret != ACOMP_ERR_OK) {
LISA_LOGE(TAG, "Logger init failed: %d", ret);
return ret;
}
/* 方式 1: 使用默认输出 */
LISA_LOGI(TAG, "Using default output...");
ret = acomp_logger_start();
if (ret != ACOMP_ERR_OK) {
LISA_LOGE(TAG, "Logger start failed: %d", ret);
return ret;
}
vTaskDelay(pdMS_TO_TICKS(3000));
/* 方式 2: 切换到自定义 printf 输出 */
LISA_LOGI(TAG, "Switching to custom printf output...");
acomp_logger_set_output_callback(custom_log_output_printf);
vTaskDelay(pdMS_TO_TICKS(3000));
/* 方式 3: 切换到带颜色的输出 */
LISA_LOGI(TAG, "Switching to colored output...");
acomp_logger_set_output_callback(custom_log_output_with_color);
vTaskDelay(pdMS_TO_TICKS(3000));
/* 方式 4: 切换到文件输出 */
LISA_LOGI(TAG, "Switching to file output...");
acomp_logger_set_output_callback(custom_log_output_to_file);
vTaskDelay(pdMS_TO_TICKS(3000));
/* 恢复默认输出 */
LISA_LOGI(TAG, "Restoring default output...");
acomp_logger_set_output_callback(NULL);
vTaskDelay(pdMS_TO_TICKS(2000));
/* 停止 logger */
ret = acomp_logger_stop();
if (ret != ACOMP_ERR_OK) {
LISA_LOGW(TAG, "Logger stop failed: %d", ret);
}
LISA_LOGI(TAG, "=== Example completed ===");
return ACOMP_ERR_OK;
}