gsensor在sleep过程中不能正常关闭的bug解决

来源:互联网 发布:社交软件的英文 编辑:程序博客网 时间:2024/05/22 14:46
sensor在启动sleep后, 不能正常关闭的bug分析和解决

今天jwisp测试代码发现, 机器sleep后, sensor并没有关闭, 而是继续不断的轮询取得硬件数据, 并上报上来. 这样会造成机器在sleep过程中, 仍然在使用电量.

为了解决这个问题, 我们来简单分析分析HAL层的代码.

通过实验, jwisp发现, sleep和唤醒的两个动作, 对应其调用的是各个sensor自己的enable方法()

我们看一下代码:

int GravitySensor::enable(int32_t, int en) {    int flags = en ? 1 : 0;    if (flags != mEnabled) {        int fd;        strcpy(&input_sysfs_path[input_sysfs_path_len], "enable");        fd = open(input_sysfs_path, O_RDWR);        if (fd >= 0) {            char buf[2];            int err;            buf[1] = 0;            if (flags) {                buf[0] = '1';                mEnabledTime = getTimestamp() + IGNORE_EVENT_TIME;            } else {                buf[0] = '0';            }            err = write(fd, buf, sizeof(buf));            close(fd);            mEnabled = flags;            setInitialState();            return 0;        }        return -1;    }    return 0;}

按下电源键, 机器进入睡眠, 则传入的en为0, mEnabled为当前sensor开启状态, 此时为1

若按下电源键唤醒机器, 则en = 1, mEnabled = 0

将enable字符串copy到input_sysfs_path字符串后, 此时在后面操作的打开和关闭的就是enable节点了

然后fd打开, 用buf往fd路径下的节点中写值, 若打开则写1, 若关闭则写0.

然后将mEnabled的状态值设为flags给定的状态值.

最后返回0

由于是从三星的sensor代码移植过来的构建成的HAL. 所以具体的情况还是有点不一样的. 经过修改后, 终于可用正常在jwisp的测试机上正常work了

下面附上修改后的代码:

int GravitySensor::enable(int32_t, int en) {    int flags = en ? 1 : 0;    if (flags != mEnabled) {        if (flags) {         data_fd = open(input_sysfs_path, O_RDWR);   mEnabledTime = getTimestamp() + IGNORE_EVENT_TIME;        } else {            close(data_fd);        }        mEnabled = flags;    }    return 0;}

其中data_fd为基类打开和关闭轮询操作的句柄

原创粉丝点击