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