sensor驱动层 --- virtual sensor

时间:2021-10-05 09:20:24

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的类型。