最近忙于编写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数据的时候出现混乱,所以关键还是解决上面这个问题,不知道是否有人碰到过类似问题,大家来讨论一下

解决方案 »

  1.   

    先检sensor是否有问题呗,有问题就不给ID呗,表示设备无效。
      

  2.   

    我好像没看懂... -1不就return NULL了 还会赋值给nh->data[]?
      

  3.   

    你是否想要:if((open_input(Eventsfd) < 0)
    || (Eventsfd[0] < 0)
    || (Eventsfd[1] < 0)
    || (Eventsfd[2] < 0)
    || (Eventsfd[3] < 0)){
        //TODO: close fd
        return NULL;
    }
    这个效果啊?
    既然要4个fd一起才能工作,那就全部成功才能工作
      

  4.   

    这样不可行,一个sensor不行,就所有的都不能用了
      

  5.   

    楼主直接控制硬件???我们使用的模拟器。2。1版本中有HTC的实现:
    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;
    }
      

  6.   

    LZ你sensor弄的HAL是android2.2还是android2.3版本的啊?