Movesense BIG_MEM传感器移动唤醒流程异常问题咨询
Movesense BIG_MEM传感器唤醒后异常重启问题
问题表现
- 摇晃传感器超过2秒后,传感器唤醒并开始闪烁LED
- 5秒后设备关机随即重启,再次闪烁LED,5秒后才进入关机模式
- 无Movesense programmer,无法查看硬件日志
硬件规格
- 传感器型号:Movesense "BIG_MEM"
- HWCONFIG: SS2_NAND
- 数据内存:128 MB FLASH
- 1-Wire master: YES
- Movesense-device-lib版本:未提供
代码说明
基于Movesense官方示例代码仅做少量修改:
- 唤醒至进入关机模式的时间间隔:
#define AVAILABILITY_TIME 5000 - 广播模式下LED闪烁周期:
#define LED_BLINKING_PERIOD 1000
完整代码
#include "movesense.h" #include "MovementWakeupApp.h" #include "common/core/debug.h" #include "component_led/resources.h" #include "component_lsm6ds3/resources.h" #include "ui_ind/resources.h" #include "system_mode/resources.h" const char* const MovementWakeupApp::LAUNCHABLE_NAME = "MoveWakeupApp"; // 唤醒至进入关机模式的时间间隔 #define AVAILABILITY_TIME 5000 // 开启AFE唤醒电路至关机的时间间隔(必须为LED_BLINKING_PERIOD的倍数) #define WAKE_PREPARATION_TIME 5000 // 广播模式下LED闪烁周期 #define LED_BLINKING_PERIOD 1000 MovementWakeupApp::MovementWakeupApp(): ResourceClient(WBDEBUG_NAME(__FUNCTION__), WB_EXEC_CTX_APPLICATION), LaunchableModule(LAUNCHABLE_NAME, WB_EXEC_CTX_APPLICATION), mTimer(wb::ID_INVALID_TIMER), counter(0) { } MovementWakeupApp::~MovementWakeupApp() { } bool MovementWakeupApp::initModule() { mModuleState = WB_RES::ModuleStateValues::INITIALIZED; return true; } void MovementWakeupApp::deinitModule() { mModuleState = WB_RES::ModuleStateValues::UNINITIALIZED; } bool MovementWakeupApp::startModule() { mModuleState = WB_RES::ModuleStateValues::STARTED; setShutdownTimer(); // 订阅Whiteboard路由表变化 asyncSubscribe(WB_RES::LOCAL::NET()); return true; } void MovementWakeupApp::stopModule() { // 停止LED定时器 stopTimer(mTimer); mTimer = wb::ID_INVALID_TIMER; mModuleState = WB_RES::ModuleStateValues::STOPPED; } void MovementWakeupApp::onNotify(wb::ResourceId resourceId, const wb::Value& value, const wb::ParameterList& parameters) { // 确认是正确的资源 if (resourceId.localResourceId != WB_RES::LOCAL::NET::LID) return; // 获取Whiteboard路由表通知 uint8_t data = WB_RES::LOCAL::NET::EVENT::ParameterListRef(parameters).getNotificationType(); // 若存在Whiteboard连接,停止定时器 if (data == WB_RES::RoutingTableNotificationTypeValues::ROUTE_NOTIFICATION_NEW) { stopTimer(mTimer); mTimer = wb::ID_INVALID_TIMER; return; } // 若Whiteboard连接断开,准备关机 if (data == WB_RES::RoutingTableNotificationTypeValues::ROUTE_NOTIFICATION_LOST) { setShutdownTimer(); } } void MovementWakeupApp::setShutdownTimer() { // 启动定时器 mTimer = startTimer(LED_BLINKING_PERIOD, true); // 重置超时计数器 counter = 0; } void MovementWakeupApp::onTimer(wb::TimerId timerId) { counter = counter + LED_BLINKING_PERIOD; if (counter < AVAILABILITY_TIME) { asyncPut(WB_RES::LOCAL::UI_IND_VISUAL(), AsyncRequestOptions::Empty, WB_RES::VisualIndTypeValues::SHORT_VISUAL_INDICATION); return; } if (counter == AVAILABILITY_TIME) { // 将AFE设置为唤醒模式 WB_RES::WakeUpState wakeupState; wakeupState.level = 2; wakeupState.state = 1; // 移动唤醒 asyncPut(WB_RES::LOCAL::COMPONENT_LSM6DS3_WAKEUP(), AsyncRequestOptions(NULL, 0, true), wakeupState); // 发送PUT请求开启LED asyncPut(WB_RES::LOCAL::COMPONENT_LED(), AsyncRequestOptions::Empty, true); // 发送PUT请求进入完全关机模式 asyncPut(WB_RES::LOCAL::SYSTEM_MODE(), AsyncRequestOptions::Empty, WB_RES::SystemModeValues::FULLPOWEROFF); } }
预期行为
摇晃Movesense传感器后立即唤醒,5秒后进入完全关机模式。
内容的提问来源于stack exchange,提问作者Govind Padhiyar
相关产品推荐
相关产品推荐

