【日志】修改ci_ctrl_mimic部件

好的,我来逐条罗列前后对比:

头文件修改 (ci_ctrl_mimic.hpp)

删除的成员变量:

  1. 删除 uint16_t m_elapsedTimeMS;

  2. 删除 uint16_t m_loopCounter;

新增的成员变量:

  1. 新增 std::chrono::steady_clock::time_point m_lastPrintTime;

  2. 新增 std::chrono::steady_clock::time_point m_capturingStartTime;

  3. 新增 std::chrono::steady_clock::time_point m_handleRespStartTime;

实现文件修改 (ci_ctrl_mimic.cpp)

1. 构造函数修改:

前:

cpp
m_elapsedTimeMS(0), m_loopCounter(0)

后:

cpp
m_lastPrintTime = std::chrono::steady_clock::now();

2. changeState() 函数修改:

前(kCapturing 状态):

cpp
// 没有特殊处理

后(kCapturing 状态):

cpp
m_capturingStartTime = std::chrono::steady_clock::now();

前(kHandleResp 状态):

cpp
m_elapsedTimeMS = 0; // 手动重置计数器

后(kHandleResp 状态):

cpp
m_handleRespStartTime = std::chrono::steady_clock::now();

3. loopHandleResp() 函数完全重构:

前(使用计数器):

cpp
bool clsCtrl::loopHandleResp()
{
    int ret = loopSendVCM();
    
    // 每1个循环,对应时长为(SLEEP_US_BSH_FSM_LOOP = 10us); 每100个循环约每1毫秒
    #define M_LOOP_CNTER_THERS (10000)
    
    m_loopCounter++;

    if (m_loopCounter > M_LOOP_CNTER_THERS) //100 ms 递增第一次 
    {
         CI_DBG_COUT << "[clsCtrl] HandleResp state: playDone=" << this->m_VCM->pAudioOut->getIsPlayDone() 
                << ", elapsedTime=" << m_elapsedTimeMS;
        m_loopCounter = 0;
        m_elapsedTimeMS += SLEEP_US_BSH_FSM_LOOP*M_LOOP_CNTER_THERS/1000;//添加ms计时
    }

    return m_elapsedTimeMS > CLOUD_RESP_TIMEOUT_MS;//检查是否超时
}

后(使用 chrono):

cpp
bool clsCtrl::loopHandleResp()
{
    int ret = loopSendVCM();
    
    // 使用 chrono 检查是否超时
    auto current_time = std::chrono::steady_clock::now();
    auto elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(
        current_time - m_handleRespStartTime
    );
    
    // 每100ms打印一次状态
    static auto last_status_time = m_handleRespStartTime;
    if (current_time - last_status_time >= std::chrono::milliseconds(100))
    {
        CI_DBG_COUT << "[clsCtrl] HandleResp state: playDone=" 
                   << this->m_VCM->pAudioOut->getIsPlayDone() 
                   << ", elapsedTime=" << elapsed_time.count() << "ms";
        last_status_time = current_time;
    }
    
    return elapsed_time.count() > CLOUD_RESP_TIMEOUT_MS;
}

4. loopFSM() 中 kCapturing 状态逻辑重构:

前(使用计数器):

cpp
case kCapturing:
{   
    m_loopCounter++;

    if (m_loopCounter > M_LOOP_CNTER_THERS) //100 ms 递增第一次 
    {
        CIAS_PRINT_INFO("[clsCtrl] HandleResp state: playDone=%d, elapsedTime=%d\n", 
                       this->m_VCM->pAudioOut->getIsPlayDone(), m_elapsedTimeMS);
        m_loopCounter = 0;
        m_elapsedTimeMS += SLEEP_US_BSH_FSM_LOOP*M_LOOP_CNTER_THERS/1000;//添加ms计时
    }

    if(m_elapsedTimeMS > 4000) // 使用累积的毫秒数判断
    {   
        // 超时处理
    }
    break;
}

后(使用 chrono):

cpp
case kCapturing:
{   
    // 使用 chrono 检查录制超时
    auto current_time = std::chrono::steady_clock::now();
    auto elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(
        current_time - m_capturingStartTime
    );
    
    // 每100ms打印一次状态
    static auto last_capture_status_time = m_capturingStartTime;
    if (current_time - last_capture_status_time >= std::chrono::milliseconds(100))
    {
        CIAS_PRINT_INFO("[clsCtrl] Capturing state: elapsedTime=%lldms\n", 
                       elapsed_time.count());
        last_capture_status_time = current_time;
    }
    
    // 4秒超时逻辑,直接使用时间差
    if(elapsed_time.count() > 4000)
    {   
        // 超时处理
    }
    break;
}

5. 状态机日志打印逻辑重构:

前(使用计数器):

cpp
void clsCtrl::loopFSM()
{
    static uint16_t cnt = 0;
    cnt++;
    if(cnt >= 2000)  // 基于循环次数
    {
        std::cout << "[fsm]loopFSM: state=" << m_state << std::endl;
        cnt = 0;
    }
    // ...
}

后(使用 chrono):

cpp
void clsCtrl::loopFSM()
{
    // 使用 chrono 控制状态机日志打印频率
    static auto last_fsm_print_time = std::chrono::steady_clock::now();
    auto current_time = std::chrono::steady_clock::now();
    
    if (current_time - last_fsm_print_time >= std::chrono::milliseconds(500))
    {
        std::cout << "[fsm]loopFSM: state=" << m_state << std::endl;
        last_fsm_print_time = current_time;
    }
    // ...
}

6. run() 函数中的计时逻辑重构:

前(使用循环计数):

cpp
void clsCtrl::run()
{
  static uint32_t g_run_cnt  = 0;
  static auto last_print_time = std::chrono::steady_clock::now();
  
  while(m_is_running)
  {
    // ...
    g_run_cnt++;
    
    // 使用时间间隔控制打印频率
    auto current_time = std::chrono::steady_clock::now();
    if (current_time - last_print_time >= std::chrono::seconds(1))
    {
        CIAS_PRINT_INFO("[clsCtrl] run() loopFSM() run_cnt=%d\n", g_run_cnt);
        last_print_time = current_time;
    }
  }
}

后(使用成员变量):

cpp
void clsCtrl::run()
{
    static uint32_t g_run_cnt = 0;
    
    while(m_is_running)
    {
        loopFSM();
        std::this_thread::sleep_for(std::chrono::microseconds(SLEEP_US_BSH_FSM_LOOP));
        g_run_cnt++;
        
        // 每秒打印一次运行统计,使用成员变量
        auto current_time = std::chrono::steady_clock::now();
        if (current_time - m_lastPrintTime >= std::chrono::seconds(1))
        {
            CIAS_PRINT_INFO("[clsCtrl] run() loopFSM() run_cnt=%d\n", g_run_cnt);
            m_lastPrintTime = current_time;
        }
    }
}

总结对比:

  1. 计数器 → 时间点m_loopCounter 和 m_elapsedTimeMS → std::chrono::time_point

  2. 手动累加 → 自动计算:手动加算毫秒数 → duration_cast 自动计算时间差

  3. 循环计数判断 → 时间间隔判断:基于循环次数判断 → 基于实际时间间隔判断

  4. 精确度提升:避免了循环时间不均匀导致的计时误差

  5. 代码简化:移除了复杂的计数器逻辑,代码更清晰

posted @ 2025-12-23 03:14  FBshark  阅读(3)  评论(0)    收藏  举报