最近忙于编写sensor hal层的代码,已经接近完成,中间有个纠结的问题拿来讨论一下:
实现 native_handle_t* (*open_data_source)(struct sensors_control_device_t *dev)这个接口如下
static native_handle_t* sensors_control_open_data_source(struct sensors_control_context_t *dev)
{
int Eventsfd[MAX_NUM_EVENTS];
int i = 0;
if((open_input(Eventsfd) < 0)
&& (Eventsfd[0] < 0)
&& (Eventsfd[1] < 0)
&& (Eventsfd[2] < 0)
&& (Eventsfd[3] < 0))
return NULL; native_handle_t *nh = native_handle_create(MAX_NUM_EVENTS, 0);
for(i = 0; i < MAX_NUM_EVENTS; i++){
nh->data[i] = Eventsfd[i];
};
//LOGE("native_handle numFds=%d, numInts=%d", nh->numFds, nh->numInts);
return nh;
}
原来是有4个sensor event,现在某sensor 芯片焊接出现问题,导致nh->data[]中有个fd是-1,这个函数返回后,到java层出现binder error,然后手机就重启,试了几次后发现,只要nh->data[]中有负的id,就会报错,但是这种情况是不被允许的,不能因为sensor出错致使手机不能用。
我也想过动态地识别当前sensor的数目,但这样需要在sensors_control_context_t 和sensors_data_context_t的函数簇之间传递数据,最后在poll数据的时候出现混乱,所以关键还是解决上面这个问题,不知道是否有人碰到过类似问题,大家来讨论一下
实现 native_handle_t* (*open_data_source)(struct sensors_control_device_t *dev)这个接口如下
static native_handle_t* sensors_control_open_data_source(struct sensors_control_context_t *dev)
{
int Eventsfd[MAX_NUM_EVENTS];
int i = 0;
if((open_input(Eventsfd) < 0)
&& (Eventsfd[0] < 0)
&& (Eventsfd[1] < 0)
&& (Eventsfd[2] < 0)
&& (Eventsfd[3] < 0))
return NULL; native_handle_t *nh = native_handle_create(MAX_NUM_EVENTS, 0);
for(i = 0; i < MAX_NUM_EVENTS; i++){
nh->data[i] = Eventsfd[i];
};
//LOGE("native_handle numFds=%d, numInts=%d", nh->numFds, nh->numInts);
return nh;
}
原来是有4个sensor event,现在某sensor 芯片焊接出现问题,导致nh->data[]中有个fd是-1,这个函数返回后,到java层出现binder error,然后手机就重启,试了几次后发现,只要nh->data[]中有负的id,就会报错,但是这种情况是不被允许的,不能因为sensor出错致使手机不能用。
我也想过动态地识别当前sensor的数目,但这样需要在sensors_control_context_t 和sensors_data_context_t的函数簇之间传递数据,最后在poll数据的时候出现混乱,所以关键还是解决上面这个问题,不知道是否有人碰到过类似问题,大家来讨论一下
|| (Eventsfd[0] < 0)
|| (Eventsfd[1] < 0)
|| (Eventsfd[2] < 0)
|| (Eventsfd[3] < 0)){
//TODO: close fd
return NULL;
}
这个效果啊?
既然要4个fd一起才能工作,那就全部成功才能工作
static native_handle_t* control__open_data_source(struct sensors_control_context_t *dev)
{
native_handle_t* handle;
int fd = open_input(O_RDONLY);
if (fd < 0) {
return NULL;
} handle = native_handle_create(1, 0);
handle->data[0] = fd;
return handle;
}