sensor驱动层 --- virtual sensor
Posted Achillisjack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sensor驱动层 --- virtual sensor相关的知识,希望对你有一定的参考价值。
virtual sensor
VirtualSensor是由实际的sensor 虚拟出来的,所有的Virtual Sensor都是class
VirtualSensor类的一个实例;
VirtualSensor类的定义如下,
class VirtualSensor : public SensorBase
sensors_event_t mLastEvent;
bool reportLastEvent;
const SensorContext *context;
sensors_event_t mBuffer[MAX_EVENTS];
sensors_event_t* mRead;
sensors_event_t* mWrite;
sensors_event_t* mBufferEnd;
ssize_t mFreeSpace;
public:
VirtualSensor(const struct SensorContext *i);
virtual ~VirtualSensor();
•••
这个类被定义在文件hardware/qcom/sensors/VirtualSensor.h中,其函数实现在对应
的文件VirtualSensor.cpp 中;
reportLastEvent是报告最后一个事件标志,当重复使能某个sensor时,该标志会被置位,当读取该sensor 中的事件时,会先读取先前上报的
最后一个sensor 事件,由mLastEvent 表示最后一个上报的sensor 事件;每一个sensor 都有一个结构体SensorContext进行描述,这个结构体
有一个类型为SensorBase,名称 为driver的指针指向对应的sensor 驱动,VirtualSensor 中的context字段就是指向其对应的SensorContext的;
mBuffer字段表示存储事件的buffer,mRead指向当读取buffer的位置,mWrite指向向buffer写入事件的位置,mBufferEnd指向buffer的结尾,
mFreeSpace表示空闲的buffer数。
VirtualSensor方法如下,
VirtualSensor::VirtualSensor(const struct SensorContext *ctx)
: SensorBase(NULL, NULL, ctx),reportLastEvent(false),context(ctx),mRead(mBuffer),
mWrite(mBuffer),mBufferEnd(mBuffer + MAX_EVENTS),mFreeSpace(MAX_EVENTS)
这个构造函数很简单,就是初始化类成员变量
enable是使能vitrual sensor的函数,实现如下:
int VirtualSensor::enable(int32_t, int en)
int flag = en ? 1 : 0;
sensor_algo_args arg;
if (mEnabled != flag)
mEnabled = flag;
arg.enable = mEnabled;
•••
激活sensor,因为是virtual sensor,所以并不需要打开底层sensor设备的文件节点,只需置位使能标记,并调用对应算法进行使能配置。
bool VirtualSensor::hasPendingEvents() const
return (mBufferEnd - mBuffer - mFreeSpace) || reportLastEvent;
这个函数判断buffer中是否还有输入事件,或者报告最后一个事件标志被使能,pollEvent函数会调用这个函数 ,virtual sensor 就是通过
这个函数来判断是否有事件可以读取;
int VirtualSensor::readEvents(sensors_event_t* data, int count)
int number = 0;
if ((count < 1) || (!mEnabled))
return -EINVAL;
//如果激活的sensor再次被激活,则上报最后一次事件
if (reportLastEvent)
•••
该函数被接口层的pollEvent 函数调用,它从buffer 中读取不起过count 的sensors_event_t事件,把这些事件信息传给Framework层;
int VirtualSensor::injectEvents(sensors_event_t* data, int count)
int i;
sensors_event_t event;
if (algo == NULL)
return 0;
for (i = 0; i < count; i++)
event = data[i];
sensors_event_t out;
••••
这个函数是virtual sensor驱动所特有的,当读取实际sensor的事件时,会调用这个函数把这个事件插入所有依赖于这个sensor的virtual sensor的buffer中。
virtual sensor的信息是由多个实际sensor得到,所以转换算法在获得了所有依赖的sensor的信息后才会成功转换成一个事件;out.sensor指明是sensor
的handle号,out.type指明sensor的类型。
以上是关于sensor驱动层 --- virtual sensor的主要内容,如果未能解决你的问题,请参考以下文章
OpenHarmony Sensor 模块Callback注册和回调全流程
Android Sensor详解Sensor ADSP Sensor1 api使用