今天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为基类打开和关闭轮询操作的句柄