小智机器人的代码流程

将小智机器人的代码流程梳理为以下几个主要步骤。整个流程可以分为 初始化音频处理任务调度通信协议 四大部分。以下是详细梳理:
小智机器人的代码流程_第1张图片


1. 初始化流程

1.1 应用启动
  • 入口函数Application::GetInstance().Start()
    • 启动整个应用程序。
    • 调用 Board::GetInstance() 获取硬件板实例。
1.2 硬件板初始化
  • 获取硬件板实例auto& board = Board::GetInstance();
    • 获取硬件板的全局实例。
  • 获取显示设备auto display = board.GetDisplay();
    • 从硬件板中获取显示设备实例。
  • 获取音频编解码器auto codec = board.GetAudioCodec();
    • 获取音频编解码器实例,并完成以下配置:
      • 输入输出的采样频率。
      • I2S 配置(用于音频数据传输)。

2. 音频处理流程

2.1 音频输入准备
  • 注册输入回调codec->OnInputReady
    • 在中断服务程序中设置事件组 event_group_ 的比特位。
    • 当音频输入数据准备好时,触发事件 AUDIO_INPUT_READY_EVENT
    • 更新 higher_priority_task_woken 变量,指示是否有更高优先级的任务被唤醒。
2.2 音频输出准备
  • 注册输出回调codec->OnOutputReady
    • 注册音频输出准备的回调函数。
2.3 启动音频通道
  • 启动音频处理codec->Start()
    • 为音频通道注册回调函数。
    • 当 I2S 通道满足事件条件时,调用注册的音频回调函数。
2.4 I2S 通道配置
  • 注册输入通道回调
    i2s_channel_register_event_callback(rx_handle_, &rx_callbacks, this);
    
    • 为 I2S 接收通道注册事件回调函数。
    • 处理数据传输完成、缓冲区溢出等事件。
  • 注册输出通道回调
    i2s_channel_register_event_callback(tx_handle_, &tx_callbacks, this);
    
    • 为 I2S 发送通道注册事件回调函数。
  • 使能 I2S 通道
    i2s_channel_enable(tx_handle_);
    i2s_channel_enable(rx_handle_);
    
    • 使能 I2S 发送和接收通道,开始数据传输。

3. 任务调度

3.1 创建主循环任务
  • 创建任务
    xTaskCreate([](void* arg) {
        Application* app = (Application*)arg;
        app->MainLoop();
        vTaskDelete(NULL);
    }, "main_loop", 4096 * 2, this, 2, nullptr);
    
    • 创建一个名为 main_loop 的任务,负责发送语音和其他主要逻辑。
3.2 音频输入处理
  • 输入音频处理InputAudio()
    • 对接收到的音频数据进行重新采样和前端处理。
3.3 音频输出处理
  • 输出音频处理OutputAudio()
    • 检查音频解码队列状态。
    • 对音频数据进行解码和重采样。
    • 将处理后的音频数据发送到音频编解码器进行输出。
3.4 其他任务
  • 任务调度task()
    • 处理其他辅助任务。

4. 通信协议

4.1 初始化协议
  • 创建协议实例
    protocol_ = std::make_unique<MqttProtocol>();
    
    • 使用 MQTT 协议与服务器通信。
4.2 注册回调函数
  • 注册音频数据回调
    protocol_->OnIncomingAudio
    
    • 处理从服务器返回的音频数据,保存到音频设备的解码队列中。
  • 注册通道打开回调
    protocol_->OnAudioChannelOpened
    
    • 处理音频通道打开事件。
4.3 打开音频通道
  • 打开通道
    MqttProtocol::OpenAudioChannel()
    
    • 通过 MQTT 协议申请 UDP 通道。
    • 处理接收到的加密音频数据。
4.4 启动协议
  • 启动协议
    protocol_->Start();
    
    • 启动 MQTT 客户端:
      MqttProtocol::StartMqttClient()
      
      • 从配置中读取 MQTT 参数。
      • 创建 MQTT 客户端实例并连接到服务器。

5. 数据处理与发送

5.1 初始化音频处理器
audio_processor_.Initialize(codec->input_channels(), codec->input_reference());
  • 初始化音频处理器,设置输入通道和参考值。
5.2 注册发送回调
audio_processor_.OnOutput([this](std::vector<int16_t>&& data) { 
    background_task_->Schedule([this, data = std::move(data)]() mutable {
        opus_encoder_->Encode(std::move(data), [this](std::vector<uint8_t>&& opus) {
            Schedule([this, opus = std::move(opus)]() {
                protocol_->SendAudio(opus);
            });
        });
    });
});
  • 注册发送语音到服务器的回调函数。
  • 使用 Opus 编码器对音频数据进行编码。
  • 通过协议模块将编码后的数据发送到服务器。

流程总结

  1. 初始化:应用启动 → 硬件板初始化 → 音频编解码器配置。
  2. 音频处理:注册输入/输出回调 → 启动音频通道 → I2S 数据传输。
  3. 任务调度:创建主循环任务 → 音频输入/输出处理 → 其他任务。
  4. 通信协议:初始化协议 → 注册回调 → 打开通道 → 启动协议。
  5. 数据处理:音频数据编码 → 通过协议发送到服务器。

你可能感兴趣的:(嵌入式,人工智能,人工智能,嵌入式硬件)