G-sensor的抖动问题

20130108
G-sensor的抖动问题:
现象:当手机在桌面静止的时候,测试应用显示z轴报点为10左右,但会频繁出现-10。x和y轴也有这个现象。用测试应用绘制曲线图发现数据完全不平滑,高概率出现跳跃,跳跃到负方向!
调查描述:
1.硬件采样和报点数据确认正确!说明硬件和驱动没有问题。
2.检查event事件,getevent发现,虽然硬件报点每次都有xyz没有缺失,但是getevent的数据有消失一个点的现象。怀疑是这个引起的。便在驱动中注释掉xy的report动作,只report Z 的值,然后直接sync。问题依旧!
再试试,在common/libs/libsensors_xxxx/Acc_Lis3dh.cpp中修改event read的代码,因为怀疑是不是当get的数据缺失一个的时候,相关代码会自动填充一个随机值导致问题。那么我就将每次读到的数据临时保存下来,只有读到一个新的值后才会用新值取代旧值。每次读到sync的时候才一次性把三个值全部写入mPendingEvent.acceleration.*  这样便能保证其他位置不会乱写这个值!
但是测试结果依然失败!情况依旧!

int AccSensor::readEvents(sensors_event_t * data, int count)
{
if (count < 1)
return -EINVAL;


if (mHasPendingEvent) {
mHasPendingEvent = false;
mPendingEvent.timestamp = getTimestamp();
*data = mPendingEvent;
return mEnabled ? 1 : 0;
}


ssize_t n = mInputReader.fill(data_fd);
if (n < 0)
return n;


int numEventReceived = 0;
input_event const *event;


while (count && mInputReader.readEvent(&event)) {
int type = event->type;
if (type == EV_ABS) {
float value = event->value;
if (event->code == EVENT_TYPE_ACCEL_X) {
mPendingEvent.acceleration.x = ACC_UNIT_CONVERSION(value);
} else if (event->code == EVENT_TYPE_ACCEL_Y) {
mPendingEvent.acceleration.y = ACC_UNIT_CONVERSION(value);
} else if (event->code == EVENT_TYPE_ACCEL_Z) {
mPendingEvent.acceleration.z = ACC_UNIT_CONVERSION(value);
}
} else if (type == EV_SYN) {
mPendingEvent.timestamp = timevalToNano(event->time);
if (mEnabled) {
//mSensorCoordinate.coordinate_data_convert(
// mPendingEvent.acceleration.v, INSTALL_DIR);
*data++ = mPendingEvent;
count--;
numEventReceived++;
}
} else {
LOGE("AccSensor: unknown event (type=%d, code=%d)",
     type, event->code);
}
mInputReader.next();
}


return numEventReceived;
}


因为2.3.5中用同样的硬件,没有任何问题,现在只能采用比较代码的办法了!!!
比较路径:
/home/yasin/mywork/xxxxroid235/3rdparty/app/app6820/special/android/hardware/xxxx/libsensors/Lis3dhSensor.cpp
&
/home/yasin/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx/Acc_Lis3dh.cpp
发现异常!
2.3.5的代码中是没有
mSensorCoordinate.coordinate_data_convert(mPendingEvent.acceleration.v,INSTALL_DIR);
这个东西的。这就是用来对sensor的贴片进行算法转换的。因为我们不能要求硬件总是把芯片贴成Z轴朝天的样子把。这就是个转换方向的。但是,转换有这么复杂吗????竟然写了这么多??而且还写错了!因为我把这个注释掉,数据就正常了!只是方向错误而已,这个很好解决!
其实换方向本身是没有错误的。但是换方向的代码总是假设每次换方向之前,这个三个值,xyz都是新的。但问题是event事件会有漏掉的情况,如果漏掉了,那么被漏掉的那个轴的值就是随机的。这就出了问题。解决的办法就是每次都把值记录下来,假如这次漏了X,那么就用上次X的值去代替!
代码如下:
yasin@ubuntu:~/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx$ git diff
diff --git a/common/libs/libsensors_xxxx/Acc_Lis3dh.cpp b/common/libs/libsensors_xxxx/Acc_Lis3dh.cpp
index 79d625c..34509a6 100644
--- a/common/libs/libsensors_xxxx/Acc_Lis3dh.cpp
+++ b/common/libs/libsensors_xxxx/Acc_Lis3dh.cpp
@@ -188,21 +188,30 @@ int AccSensor::readEvents(sensors_event_t * data, int count)
 
        int numEventReceived = 0;
        input_event const *event;
+       static float temp_x;
+       static float temp_y;
+       static float temp_z;
 
        while (count && mInputReader.readEvent(&event)) {
                int type = event->type;
                if (type == EV_ABS) {
                        float value = event->value;
                        if (event->code == EVENT_TYPE_ACCEL_X) {
-                               mPendingEvent.acceleration.x = ACC_UNIT_CONVERSION(value);
+                               //mPendingEvent.acceleration.x = ACC_UNIT_CONVERSION(value);
+                               temp_x = ACC_UNIT_CONVERSION(value);
                        } else if (event->code == EVENT_TYPE_ACCEL_Y) {
-                               mPendingEvent.acceleration.y = ACC_UNIT_CONVERSION(value);
+                               //mPendingEvent.acceleration.y = ACC_UNIT_CONVERSION(value);
+                               temp_y = ACC_UNIT_CONVERSION(value);
                        } else if (event->code == EVENT_TYPE_ACCEL_Z) {
-                               mPendingEvent.acceleration.z = ACC_UNIT_CONVERSION(value);
+                               //mPendingEvent.acceleration.z = ACC_UNIT_CONVERSION(value);
+                               temp_z = ACC_UNIT_CONVERSION(value);
                        }
                } else if (type == EV_SYN) {
                        mPendingEvent.timestamp = timevalToNano(event->time);
                        if (mEnabled) {
+                               mPendingEvent.acceleration.x = temp_x;
+                               mPendingEvent.acceleration.y = temp_y;
+                               mPendingEvent.acceleration.z = temp_z;
                                mSensorCoordinate.coordinate_data_convert(
                                                mPendingEvent.acceleration.v, INSTALL_DIR);
                                *data++ = mPendingEvent;
yasin@ubuntu:~/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx$ 
yasin@ubuntu:~/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx$ 
yasin@ubuntu:~/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx$ 
yasin@ubuntu:~/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx$ 
yasin@ubuntu:~/mywork/xxxxroid403code/device/xxxx/common/libs/libsensors_xxxx$ 




但是为什么event系统会漏掉一些东西,我还没找到原因













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YasinLeeX

再来一杯西湖龙井。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值