You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双击启停数据记录器异常:Acc路径仅能启动无法停止的排查

问题描述

使用数据记录器(Datalogger)采集数据时,路径Meas/HR下双击传感器可正常启动、停止记录会话并保存数据;但切换至路径/Meas/Acc/104或/Meas/Acc/13时,双击仅能启动记录,无法停止会话。

现有代码分析

从提供的代码来看,核心问题在于双击事件的处理逻辑仅切换了开关状态,未根据数据记录器的实际运行状态执行启停操作,同时缺少Acc路径对应的停止逻辑和状态跟踪机制:

  1. onNotify中仅切换DoubleTAPEnabled布尔值,未关联记录器的启停操作;
  2. 无变量跟踪当前是否正在记录、以及当前记录的路径;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:13:22