如何理解Sensor架构 - 华清远见 - 图文 下载本文

内容发布更新时间 : 2024/11/2 16:40:44星期一 下面是文章的全部内容请认真阅读。

};

SortedVector< wp > getActiveConnections() const; DefaultKeyedVector getActiveVirtualSensors() const; String8 getSensorName(int handle) const;

void recordLastValue(sensors_event_t const * buffer, size_t count); static void sortEventBuffer(sensors_event_t* buffer, size_t count); void registerSensor(SensorInterface* sensor); void registerVirtualSensor(SensorInterface* sensor); // constants

Vector mSensorList; // Sensor列表

Vector mUserSensorList; //与mSensorList一样

DefaultKeyedVector mSensorMap; //其成员为HardwareSensor Vector mVirtualSensorList; //其成员为HardwareSensor status_t mInitCheck; // protected by mLock mutable Mutex mLock;

DefaultKeyedVector mActiveSensors; //成员为SensorRecord

DefaultKeyedVector mActiveVirtualSensors; //成员为HardwareSensor SortedVector< wp > mActiveConnections;

// The size of this vector is constant, only the items are mutable KeyedVector mLastEventSeen; public:

static char const* getServiceName() { return \void cleanupConnection(SensorEventConnection* connection);

/*

1) 调用HardwareSensor::activate,即SensorDevice::activate 2) 然后创建SensorRecord并增加到列表mActiveSensors 3) 把此HardwareSensor增加到连接的mSensorInfo 4) 把此连接增加到mActiveConnections中 */

status_t enable(const sp& connection, int handle); /*

1) 把此sensor从连接的mSensorInfo中删除 2) 把此连接从mActiveConnections中删除

3) 调用HardwareSensor::activate,即SensorDevice::activate */

status_t disable(const sp& connection, int handle); /*

1)调用HardwareSensor::setDelay,即SensorDevice::setDelay */

status_t setEventRate(const sp& connection, int handle, nsecs_t ns); }

2.5 SensorDevice.cpp

SensorDevice封装了对SensorHAL层代码的调用,主要包含以下功能: 1) 获取sensor列表(getSensorList) 2) 获取sensor事件(poll)

3) Enable或Disable sensor (activate) 4) 设置delay时间

[cpp]

view plaincopyclass SensorDevice : public Singleton { friend class Singleton;

struct sensors_poll_device_t* mSensorDevice; // sensor设备 struct sensors_module_t* mSensorModule;

mutable Mutex mLock; // protect mActivationCount[].rates // fixed-size array after construction struct Info { Info() : delay(0) { } KeyedVector rates; nsecs_t delay;

status_t setDelayForIdent(void* ident, int64_t ns); nsecs_t selectDelay(); };

DefaultKeyedVector mActivationCount; /*

1) 调用hw_get_module(SENSORS_HARDWARE_MODULE_ID,..)获取sensors_module_t, 并保存在mSensorModule中

2) 调用mSensorModule->common->methods->open,以返回sensors_poll_device_t, 并保存在mSensorDevice中

3) 调用mSensorModule->get_sensors_list所有可访问的sensor_t 4) 调用mSensorDevice->activate激活所有的sensor */

SensorDevice();

public:

// 调用mSensorModule->get_sensors_list实现 ssize_t getSensorList(sensor_t const** list); status_t initCheck() const; // 调用mSensorDevice->poll实现

ssize_t poll(sensors_event_t* buffer, size_t count); // 调用mSensorDevice->activate实现

status_t activate(void* ident, int handle, int enabled); // 调用mSensorDevice->setDelay实现

status_t setDelay(void* ident, int handle, int64_t ns); void dump(String8& result, char* buffer, size_t SIZE); };

2.6 Sensor HAL

定义:/hardware/libhardware/include/hardware/sensors.h 实现:/hardware/mychip/sensor/st/sensors.c 2.6.1 struct sensors_poll_device_t 定义 [cpp]

view plaincopystruct sensors_poll_device_t { struct hw_device_t common;

// Activate/deactivate one sensor.

int (*activate)(struct sensors_poll_device_t *dev, int handle, int enabled);

// Set the delay between sensor events in nanoseconds for a given sensor. int (*setDelay)(struct sensors_poll_device_t *dev,

int handle, int64_t ns);

// Returns an array of sensor data.

int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int count); };

2.6.2 struct sensors_module_t 定义 [cpp]

view plaincopystruct sensors_module_t { struct hw_module_t common; /**

* Enumerate all available sensors. The list is returned in \* @return number of sensors in the list */

int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list); };

2.6.3 struct sensor_t 定义 [cpp]

view plaincopystruct sensor_t { /* name of this sensors */ const char* name;

/* vendor of the hardware part */ const char* vendor;

/* version of the hardware part + driver. The value of this field