当前位置: 首页 > news >正文

【日志】修改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. 代码简化:移除了复杂的计数器逻辑,代码更清晰

http://www.jsqmd.com/news/126327/

相关文章:

  • LangFlow如何降低AI项目开发成本?真实案例数据分析
  • 全面讲解Proteus元器件库大全的分类结构
  • 基于usb_burning_tool的产线刷机操作指南
  • 自动拨号和录音的App解决方案
  • LangFlow Kingsoft Cloud KSME
  • LangFlow Highlight.io开发者优先监控
  • C 语言中函数声明、定义与链接的一点说明
  • 深入浅出 Go 流程控制:从循环到延迟执行
  • 48、C 编程中的实用技巧与特性
  • LangFlow Mouseflow点击分布与滚动图
  • Multisim14仿真结果导入Ultiboard的实践方法
  • 49、C编程:从Main方法到嵌套类型的全面解析
  • LangFlow GoatCounter极简网页计数器
  • STM32CubeMX串口通信接收图解说明(小白友好)
  • LangFlow Airbrake快速定位代码缺陷
  • LangFlow PostHog开源产品分析
  • LangFlow Countly移动与Web分析
  • 基于模拟量读取的红外阵列:Arduino循迹小车核心要点
  • ESP32-CAM如何连接手机APP?一文说清通信机制(Arduino)
  • LangFlow Simple Analytics无Cookie分析
  • LangFlow Treo APMP性能监控
  • Intel HAXM安装失败?通俗解释每一步排查方法
  • LangFlow ThousandEyes网络智能洞察
  • 基于screen+的冗余HMI界面设计实战
  • ModbusTCP报文解析安全风险与防护建议
  • 掌握大数据领域 Hive 的动态分区技术
  • LangFlow vRealize Operations VMware环境优化
  • LangFlow UCloud UMeter监控体系
  • Keil C51中LCD1602初始化流程手把手教程
  • LangFlow可视化引擎详解:节点、连接与实时预览机制