CC2640 SensorTag Movement 传感器bug
发现过程:
使用SnesorTag app 安卓版连接SensorTag,Motion Data 一栏,打开Wake on shake , Sensor period 设置大于1000ms 比如1001,这时Wake on shake功能失效。
原因:
SensorTag_Mov.c 在SensorTagMov_processSensorEvent(void)函数中,为了使得无论sensor period 配置多少 ,总的shake wake时间相同,控制sensor value发送次数的nActivity被赋值为MOVEMENT_INACT_CYCLES
#define MOVEMENT_INACT_CYCLES ( MOVEMENT_INACT_TIMEOUT * (1000/sensorPeriod) )
#define MOVEMENT_INACT_TIMEOUT 10 // 10 seconds
因为上述宏是整数,所以当sensorPeriod 大于1000时,1000/sensorPeriod = 0,MOVEMENT_INACT_CYCLES也等于0, nActivity被赋值为0,所以在以下代码中 Movement_setParameter(SENSOR_DATA, SENSOR_DATA_LEN, sensorData)永远不会被调用。
if (nActivity>0)
{
if (appState != APP_STATE_ACTIVE)
{
// Transition to active state
appState = APP_STATE_ACTIVE;
nMotions = 0;
if (sensorMpu9250Reset())
{
sensorMpu9250Enable(axes);
}
}
if (mpuConfig & MOV_WOM_ENABLE)
{
nActivity--;
}
// Send data
Movement_setParameter(SENSOR_DATA, SENSOR_DATA_LEN, sensorData);
}
解决方法:
#define MOVEMENT_INACT_CYCLES ( MOVEMENT_INACT_TIMEOUT * (1000/sensorPeriod) )
修改为
#define MOVEMENT_INACT_CYCLES ( (MOVEMENT_INACT_TIMEOUT * ((1000 << 7)/sensorPeriod)) >>7)
好的,我们也验证一下。
好像BUG在ANDROID的代码里会多一些。