【问题标题】:Double Tap Parameter Configuration can not set from Internal CodeDouble Tap Parameter Configuration 无法通过内码设置
【发布时间】:2023-02-08 19:44:55
【问题描述】:

我正在为双击事件编写代码,但它运行不正常,所以我认为配置以下内部寄存器可能有助于获得更好的结果:

  1. doubleTapDur,
  2. doubleTap安静,
  3. 点击Ths,
  4. 为了设置寄存器的值,我通过 Movesense showcase adb bridge app 使用了 ADB bridge。这是 APK 的链接:Showcaseapp-debug_adb-bridge-build.apk

    我使用下面的命令来读写双击参数。它正在工作。

    阅读:

    adb.exe shell am broadcast -a "android.intent.action.MOVESENSE"  --es type get --es path Component/LSM6DS3/TapParams --es value '''{}'''
    
    

    写:

     adb.exe shell am broadcast -a "android.intent.action.MOVESENSE"  --es type put --es path Component/LSM6DS3/TapParams --es value '''{\"newParams\":{\"doubleTapDur\": 8, \"doubleTapQuiet\": 3, \"tapThs\": 8, \"axes\": 8}}'''
    

    为了在内部(内部代码)设置这些参数,我编写了一个函数 DoubleTAPConfig(),它在 params 中设置值。但它不起作用。我不确定我错过了什么。任何帮助将不胜感激。

    这是我的代码:-

    #include "DOUBLETAP.h"
    #include "common/core/debug.h"
    #include "component_led/resources.h"
    #include "component_lsm6ds3/resources.h"
    #include "movesense.h"
    #include "system_mode/resources.h"
    #include "system_states/resources.h"
    #include "ui_ind/resources.h"
    
    const size_t BLINK_PERIOD_MS = 1000;
    #define AVAILABILITY_TIME 5000
    
    // LED blinking period in adertsing mode
    #define LED_BLINKING_PERIOD 100
    
    const char* const DOUBLETAP::LAUNCHABLE_NAME = "DOUBLETAP";
    
    
    
    DOUBLETAP::DOUBLETAP()
        : ResourceClient(WBDEBUG_NAME(__FUNCTION__), WB_EXEC_CTX_APPLICATION),
          LaunchableModule(LAUNCHABLE_NAME, WB_EXEC_CTX_APPLICATION),
          DOUBLETAPEnabled(false),
          mTimer(wb::ID_INVALID_TIMER),
          mCounter(0)
    {
    }
    
    DOUBLETAP::~DOUBLETAP()
    {
    }
    
    bool DOUBLETAP::initModule()
    {
    
        DEBUGLOG("DOUBLETAP::initModule");
        this->mModuleState = WB_RES::ModuleStateValues::INITIALIZED;
    
        return true;
    }
    
    void DOUBLETAP::deinitModule()
    {
        DEBUGLOG("DOUBLETAP::deinitModule");
        this->mModuleState = WB_RES::ModuleStateValues::UNINITIALIZED;
    }
    
    bool DOUBLETAP::startModule()
    {
        DEBUGLOG("DOUBLETAP::startModule");
        this->mModuleState = WB_RES::ModuleStateValues::STARTED;
        this->mTimer = startTimer(BLINK_PERIOD_MS, true); // Start LED timer. true = trigger repeatedly
    
        // set internal resistor value for doubletap mode
        DoubleTAPConfig();
        // Subscribe to DOUBLETAP detection
        this->asyncSubscribe(WB_RES::LOCAL::SYSTEM_STATES_STATEID(), AsyncRequestOptions::Empty, WB_RES::StateIdValues::DOUBLETAP);
    
        return true;
    }
    
    void DOUBLETAP::stopModule()
    {
        DEBUGLOG("DOUBLETAP::stopModule");
        this->stopTimer(mTimer); // Stop LED timer
        this->mTimer = wb::ID_INVALID_TIMER;
    
        // Unsubscribe DOUBLETAP detection
    
        this->asyncUnsubscribe(WB_RES::LOCAL::SYSTEM_STATES_STATEID(), AsyncRequestOptions::Empty, WB_RES::StateIdValues::DOUBLETAP);
    
        this->mModuleState = WB_RES::ModuleStateValues::STOPPED;
    }
    
    void DOUBLETAP::onTimer(wb::TimerId timerId)
    {
    
        if (DOUBLETAPEnabled)
        {
            this->asyncPut(WB_RES::LOCAL::UI_IND_VISUAL(), AsyncRequestOptions::Empty, WB_RES::VisualIndTypeValues::SHORT_VISUAL_INDICATION);
            // break;
        }
        else
        {
            DOUBLETAPEnabled = false;
            // break;
        }
    }
    
    void DOUBLETAP::onNotify(wb::ResourceId resourceId, const wb::Value& value, const wb::ParameterList& parameters)
    {
    
        DEBUGLOG("DOUBLETAP::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;
            }
        }
        }
    }
    
    void DOUBLETAP::DoubleTAPConfig()
    {
        WB_RES::TapParams TapConfig;
    
        TapConfig.doubleTapDur = 8;   // set 0-15   Default:_ 0000
        TapConfig.doubleTapQuiet = 3; // set 0-3    Default value:_ 00
        TapConfig.tapThs = 8;         // set 0-31    Default value:_ 00000
        TapConfig.axes = 8;           // set 0-14   bitfield:_ x=8, y=4, z=2
    
        asyncPut(WB_RES::LOCAL::COMPONENT_LSM6DS3_TAPPARAMS(), AsyncRequestOptions::Empty, TapConfig);
        
        // also try with this coomund line 
       // asyncPut(WB_RES::LOCAL::COMPONENT_LSM6DS3_WAKEUP(),AsyncRequestOptions(NULL, 0, true), TapConfig);
    
    }
    
    

    我不确定我错过了什么。任何帮助将不胜感激。

【问题讨论】:

    标签: c++ movesense


    【解决方案1】:

    /Component/LSM6DS3/TapParams - 资源直接访问 LSM6 芯片寄存器,因此在您的固件代码中会发生以下情况:

    1. 您将 tap-params 设置到寄存器中(DoubleTAPConfig 方法)
    2. 您启动 DOUBLE_TAP 检测,这会立即将寄存器中的点击参数重置为默认值

      你需要:

      1. 先订阅DOUBLE_TAP服务
      2. 只有在它运行时(最安全的方法是等到您收到带有 resultCode == 200 的 onSubscribeResult 回调),调用 DoubleTAPConfig()。

        全面披露:我为 Movesense 团队工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2014-01-26
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2010-12-12
      相关资源
      最近更新 更多