欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

android hid 音量,android Hid 实现注意事项

发布时间:2023/12/15 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 android hid 音量,android Hid 实现注意事项 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

使用cypress平台上时,调试A+G sensor时,通过HID协议在Android上枚举出hid的设备文件,因为A+G是一体的,所以cypress将A+G的数据通过一个HID通道数据发送,android层主动发送取数据的命令,cpress 这面将数据发送到HID设备文件中,但是遇到有时候A+G的数据错乱,但是有时候又不会。

while(true){

while(eventQue.size()>0&&eventNum<=count){

data[eventNum]=eventQue.front();

eventQue.pop();

eventNum++;

}

if(eventNum>0)

returneventNum;

num=poll(mModule.pollfds,mModule.count+1,-1);

if(num<=0){

err=errno;

LOGE("HidSensors: sensor hal poll error: %d %s",err,strerror(err));

return-err;

}

usleep(50*1000);

for(inti=0;i

if(mModule.pollfds[i].revents&POLLIN){

if(i==0){

num=read(mModule.pollfds[0].fd,pipedata,sizeof(pipedata));

if(num<=0){

err=errno;

LOGE("HidSensors: sensor hal read error: %d %s",err,strerror(err));

return-err;

}

mModule.pollfds[pipedata[0]].fd=pipedata[2];

LOGI("HidSensor: sensor hal fd = %d",pipedata[2]);

}

else

mModule.sensors[i-1]->getData(eventQue);

}

elseif(mModule.pollfds[i].revents!=0){

mModule.pollfds[i].fd=-1;

LOGE("HidSensors: sensor hal poll event error: %d fd: %d type: %d",mModule.pollfds[i].revents,mModule.pollfds[i].fd,mModule.sensors[i-1]->getDevice().getType());

}

mModule.pollfds[i].revents=0;

}

}

return-1;

mModule 中存放主要的数据结构,循环中会调用

mModule.sensors[i-1]->getData(eventQue);

因为数据错乱的原因:我们分析有以下原因:

1.不同的进程调度,怀疑理由:在PC端开不同的线程读取数据,会发生读出的数据错乱,但是很显然,循环是一个线层,通过加锁也无法避免看来不是这个原因。

2.底层数据错误,实际通过PC端数据顺序读取不会出现问题。

后来突然想到每个sensor的实例都要enable一次,enable函数会打开hid的设备文件,意味着A和G的设备描述符不同的,虽然打开文件相同。应该是文件读写指针不对,后来定义了一个静态fd文件描述符,A+G共享一个,后来成功解决数据错乱的原因。

结论:

1. 由于进程级文件描述符表的存在,不同的进程中会出现相同的文件描述符,它们可能指向同一个文件,也可能指向不同的文件

2. 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一    个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。

3.但是在同一线程中不会同步偏移量。

总结

以上是生活随笔为你收集整理的android hid 音量,android Hid 实现注意事项的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。