双击启停数据记录器异常:Acc路径仅能启动无法停止的排查
问题描述
使用数据记录器(Datalogger)采集数据时,路径Meas/HR下双击传感器可正常启动、停止记录会话并保存数据;但切换至路径/Meas/Acc/104或/Meas/Acc/13时,双击仅能启动记录,无法停止会话。
现有代码分析
从提供的代码来看,核心问题在于双击事件的处理逻辑仅切换了开关状态,未根据数据记录器的实际运行状态执行启停操作,同时缺少Acc路径对应的停止逻辑和状态跟踪机制:
onNotify中仅切换DoubleTAPEnabled布尔值,未关联记录器的启停操作;- 无变量跟踪当前是否正在记录、以及当前记录的路径;
startDataLoggerAcc仅实现启动逻辑,无对应停止函数,也未在启动后标记记录状态。
解决方案
1. 添加状态跟踪变量
在DataLoggerClient类中添加成员变量,用于记录当前运行状态和目标路径:
// 标记当前是否处于记录状态 bool mIsLogging = false; // 记录当前正在采集的路径 std::string mCurrentLogPath;
2. 实现通用停止函数
添加停止数据记录的函数,统一处理记录器的停止逻辑:
void DataLoggerClient::stopDataLogger() { DEBUGLOG(" stopDataLogger "); wb::Result stateResult = asyncPut( WB_RES::LOCAL::MEM_DATALOGGER_STATE(), AsyncRequestOptions::Empty, WB_RES::DataLoggerStateValues::Type::DATALOGGER_STOPPED); if (wb::RETURN_OK(stateResult)) { DEBUGLOG("Datalogger stopping success: %u", stateResult); mIsLogging = false; mCurrentLogPath.clear(); } else { DEBUGLOG("Datalogger stopping failed: %u", stateResult); } }
3. 修改双击事件处理逻辑
更新onNotify函数,根据当前记录状态执行启动或停止操作:
void DataLoggerClient::onNotify(wb::ResourceId resourceId, const wb::Value& value, const wb::ParameterList& parameters) { DEBUGLOG("DataLoggerClient::onNotify"); switch (resourceId.localResourceId) { case WB_RES::LOCAL::SYSTEM_STATES_STATEID::LID: { const WB_RES::StateChange& stateChange = value.convertTo<const WB_RES::StateChange&>(); if (stateChange.stateId == WB_RES::StateIdValues::DOUBLETAP) { DEBUGLOG("Lead state updated. newState: %d", stateChange.newState); DoubleTAPEnabled = !DoubleTAPEnabled; // 根据当前状态判断执行启动还是停止 if (mIsLogging) { stopDataLogger(); } else { // 此处可根据业务逻辑切换要启动的路径(示例为/Meas/Acc/13) mCurrentLogPath = "/Meas/Acc/13"; startDataLoggerAcc(); mIsLogging = true; } } break; } } }
4. 完善Acc路径启动函数
修改startDataLoggerAcc,启动成功后标记记录状态:
void DataLoggerClient::startDataLoggerAcc() { DEBUGLOG(" startDataLogger "); WB_RES::DataEntry entry; entry.path = "/Meas/Acc/13"; mCurrentLogPath = entry.path; WB_RES::DataLoggerConfig dataLoggerConfig; WB_RES::DataEntry entries[] = {entry}; dataLoggerConfig.dataEntries.dataEntry = wb::MakeArray<WB_RES::DataEntry>(entries, 1); wb::Result configureResult = asyncPut(WB_RES::LOCAL::MEM_DATALOGGER_CONFIG(), AsyncRequestOptions::Empty, dataLoggerConfig); if (!wb::RETURN_OK(configureResult)) { DEBUGLOG("Datalogger configuring failed: %u", configureResult); return; } wb::Result stateResult = asyncPut( WB_RES::LOCAL::MEM_DATALOGGER_STATE(), AsyncRequestOptions::Empty, WB_RES::DataLoggerStateValues::Type::DATALOGGER_LOGGING); if (wb::RETURN_OK(stateResult)) { DEBUGLOG("Datalogger enabling success: %u", stateResult); mIsLogging = true; } else { DEBUGLOG("Datalogger enabling failed: %u", stateResult); mIsLogging = false; } }
5. 统一HR路径逻辑(可选)
如果HR路径有独立的启动函数,建议同步添加mIsLogging和mCurrentLogPath的状态更新,保证逻辑一致性。
关键说明
- 核心修复点:通过状态跟踪变量明确当前记录状态,双击事件触发时根据状态执行对应启停操作;
- 停止操作的核心是调用
asyncPut将记录器状态设置为DATALOGGER_STOPPED,这是结束会话并保存数据的必要步骤。
内容的提问来源于stack exchange,提问作者Govind Padhiyar
相关产品推荐
相关产品推荐

