AndroidL 传感器系统
来源:互联网 发布:sql replace 替换空格 编辑:程序博客网 时间:2024/06/05 07:20
通常在Android的Manager里都会维护对其管理Service的引用,用户程序提出Service操作申请,Manager将操作申请交由其管理的Service处理,然后将处理结果再交给用户程序或回调用户注册的监听接口。
整个传感器调用过程为APP --> SensorManager.java --> SensorService.java --> SensorDevice -->sensor
1.传感器的使用
通常编写一个传感器的应用程序有以下步骤:
void sensorTest(Context context) {
// 定义传感器监听器
SensorEventListener sensorEventListener = new SensorEventListener() {
// 传感器数值发生变化时调用此函数
@Override
public void onSensorChanged(SensorEvent paramSensorEvent) {
}
// 传感器精度发生变化时调用此函数
@Override
public void onAccuracyChanged(Sensor paramSensor, int paramInt) {
}
};
// 获取封装了SensorService的SensorManager对象
SensorManager sm = (SensorManager) context.getSystemService(SENSOR_SERVICE);
// 获得指定类型的传感器对象
Sensor tempSensor = sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
// 注册传感器对象的监听器
sm.registerListener(sensorEventListener, tempSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
2.SensorManager的获取,由下面分析可得服务是在第一次调用的时候才创建的
在上例中通过Context.getSystemService(SENSOR_SERVICE);来获取Sensor系统服务.
getSystemService方法是在frameworks/base/core/java/android/content/Context.java中定义的抽象函数,
具体是在frameworks/base/core/java/android/app/ContextImpl.java中实现的,
class ContextImpl extends Context {
........
static class ServiceFetcher {
int mContextCacheIndex = -1;
// 从SYSTEM_SERVICE_MAP键值表查找与键值对应的对象ServiceFetcher
public Object getService(ContextImpl ctx) {
ArrayList<Object> cache = ctx.mServiceCache; // mServiceCache为服务的缓存
Object service;
synchronized (cache) {
if (cache.size() == 0) { // 第一次进入时没有对象,所以size()为0
// 初始化cache
for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
cache.add(null);
}
} else {
service = cache.get(mContextCacheIndex); // 从缓存中读取服务
if (service != null) {
return service;
}
}
service = createService(ctx); // 创建服务
cache.set(mContextCacheIndex, service); // 保存到缓存中
return service;
}
}
// 这个方法在子类中必须要重载,否则会在此抛异常
public Object createService(ContextImpl ctx) {
throw new RuntimeException("Not implemented");
}
}
........
private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new HashMap<String, ServiceFetcher>(); // 定义SYSTEM_SERVICE_MAP哈希键值映射表
private static int sNextPerContextServiceCacheIndex = 0; // sNextPerContextServiceCacheIndex为Android服务的索引值
private static void registerService(String serviceName, ServiceFetcher fetcher) {// 注册服务
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher); // 为哈希键值表SYSTEM_SERVICE_MAP赋值
}
static { // 静态注册三十多个服务
........
registerService(SENSOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new SystemSensorManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler().getLooper()); // 此处用的是主线程的looper,共享消息队列
}});
........
}
........
final ArrayList<Object> mServiceCache = new ArrayList<Object>(); // 定义mServiceCache,用于缓存服务
........
@Override
public Object getSystemService(String name) {
}
}
3.SystemSensorManager对象创建过程
在上面注册的三十多个服务,其中就有一个是SensorManager的子类SystemSensorManager
// frameworks/base/core/java/android/hardware/SystemSensorManager.java
public class SystemSensorManager extends SensorManager {
private static native void nativeClassInit(); //【见详解】
private static native int nativeGetNextSensor(Sensor sensor, int next); // 【见详解】
private static boolean sSensorModuleInitialized = false; // 标志Sensor module是否已初始化
private static final Object sSensorModuleLock = new Object();
private static final ArrayList<Sensor> sFullSensorsList = new ArrayList<Sensor>();// Sensor缓存
........
private final Looper mMainLooper; // 保存主线程的Looper
private final int mTargetSdkLevel;
public SystemSensorManager(Context context, Looper mainLooper) {
mMainLooper = mainLooper; // 由上可得此处传入的是主线程Activity的Looper
mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
synchronized(sSensorModuleLock) {
if (!sSensorModuleInitialized) { // 如果Sensor module未初始化
sSensorModuleInitialized = true;
nativeClassInit(); // 调用本地方法初始化本地变量
// initialize the sensor list
final ArrayList<Sensor> fullList = sFullSensorsList; // sFullSensorsList用于保存下面创建的sensor
int i = 0;
do {
Sensor sensor = new Sensor(); // 创建Sensor对象
i = nativeGetNextSensor(sensor, i); // 调用本地方法初始化
if (i>=0) {
// 将创建的Sensor对象添加到缓存中
fullList.add(sensor);
sHandleToSensor.append(sensor.getHandle(), sensor);
}
} while (i>0);
}
}
}
@Override
protected List<Sensor> getFullSensorList() { // 获取Sensor缓存
return sFullSensorsList;
}
}
// SensorManager中getDefaultSensor的实现
// frameworks/base/core/java/android/hardware/SensorManager.java
public abstract class SensorManager {
........
private final SparseArray<List<Sensor>> mSensorListByType =
new SparseArray<List<Sensor>>(); // 稀疏数组mSensorListByType用于缓存前面获取过的传感器列表
private LegacySensorManager mLegacySensorManager;
// 以下定义了十几种传感器
public static final int SENSOR_ORIENTATION = 1 << 0;
public static final int SENSOR_ACCELEROMETER = 1 << 1;
public static final int SENSOR_TEMPERATURE = 1 << 2;
........
// 定义SensorListener#onSensorChanged获取到的数组中值的索引
public static final int DATA_X = 0;
public static final int DATA_Y = 1;
public static final int DATA_Z = 2;
........
// 定义各种物理常量
public static final float STANDARD_GRAVITY = 9.80665f;
public static final float GRAVITY_SUN = 275.0f;
public static final float GRAVITY_MERCURY = 3.70f;
........
// 定义获取传感器值的频率常量
public static final int SENSOR_DELAY_FASTEST = 0;
public static final int SENSOR_DELAY_GAME = 1;
public static final int SENSOR_DELAY_UI = 2;
public static final int SENSOR_DELAY_NORMAL = 3;
// 定义传感器精度相关的值
public static final int SENSOR_STATUS_NO_CONTACT = -1; // 未连接到传感器
public static final int SENSOR_STATUS_UNRELIABLE = 0; // 需要校准或者传感器不可读
public static final int SENSOR_STATUS_ACCURACY_LOW = 1; // 需要校准,精度低
public static final int SENSOR_STATUS_ACCURACY_MEDIUM = 2; // 平均精度,需要校准
public static final int SENSOR_STATUS_ACCURACY_HIGH = 3; // 精度高
........
// getFullSensorList的定义地方
protected abstract List<Sensor> getFullSensorList();
........
// 获取指定类型的传感器
public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list;
final List<Sensor> fullList = getFullSensorList(); // 调用子类中的getFullSensorList()方法
synchronized (mSensorListByType) {
list = mSensorListByType.get(type); // 从稀疏数组中获取传入的类型
if (list == null) { // 如果获取到结果不为空则直接返回,否则
if (type == Sensor.TYPE_ALL) { // 如果要获取的是全部传感器,则返回从子类中获取到的fullList
list = fullList;
} else { // 在子类中获取的传感器列表fullList中查找符合条件的传感器,并添加到稀疏数组mSensorListByType中
list = new ArrayList<Sensor>();
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
mSensorListByType.append(type, list);
}
}
return list;
}
public Sensor getDefaultSensor(int type) {
// 调用上面定义的getSensorList方法来获取指定类型的传感器列表
List<Sensor> l = getSensorList(type);
boolean wakeUpSensor = false;
// 以下类型的传感器需要直接唤醒
if (type == Sensor.TYPE_PROXIMITY || type == Sensor.TYPE_SIGNIFICANT_MOTION ||
type == Sensor.TYPE_TILT_DETECTOR || type == Sensor.TYPE_WAKE_GESTURE ||
type == Sensor.TYPE_GLANCE_GESTURE || type == Sensor.TYPE_PICK_UP_GESTURE) {
wakeUpSensor = true;
}
// 返回满足条件的第一个传感器
for (Sensor sensor : l) {
if (sensor.isWakeUpSensor() == wakeUpSensor) return sensor;
}
return null;
}
}
4.SensorManager对应的JNI方法
// frameworks/base/core/jni/android_hardware_SensorManager.cpp
........
static void nativeClassInit (JNIEnv *_env, jclass _this)
{
jclass sensorClass = _env->FindClass("android/hardware/Sensor"); // 获取Java框架层的Sensor类
SensorOffsets& sensorOffsets = gSensorOffsets; // 定义一个SensorOffsets结构体对象
// 将Java框架层的Sensor类中的成员保存在gSensorOffsets结构体中
sensorOffsets.name = _env->GetFieldID(sensorClass, "mName", "Ljava/lang/String;");
sensorOffsets.vendor = _env->GetFieldID(sensorClass, "mVendor", "Ljava/lang/String;");
sensorOffsets.version = _env->GetFieldID(sensorClass, "mVersion", "I");
sensorOffsets.handle = _env->GetFieldID(sensorClass, "mHandle", "I");
sensorOffsets.type = _env->GetFieldID(sensorClass, "mType", "I");
........
}
static jint nativeGetNextSensor(JNIEnv *env, jclass clazz, jobject sensor, jint next)
{
SensorManager& mgr(SensorManager::getInstance()); // 创建一个本地的SensorManager对象【见详解】
........
return size_t(next) < count ? next : 0;
}
........
// 定义java与c++方法对应函数表
static JNINativeMethod gSystemSensorManagerMethods[] = {
{"nativeClassInit",
"()V",
(void*)nativeClassInit },
{"nativeGetNextSensor",
"(Landroid/hardware/Sensor;I)I",
(void*)nativeGetNextSensor },
};
........
int register_android_hardware_SensorManager(JNIEnv *env)
{
// 注册上面定义的函数对应表
jniRegisterNativeMethods(env, "android/hardware/SystemSensorManager",
gSystemSensorManagerMethods, NELEM(gSystemSensorManagerMethods));
........
}
5.本地SensorManager的定义
// frameworks/base/include/gui/SensorManager.h
class SensorManager :
public ASensorManager,
public Singleton<SensorManager> // 继承单例模式
{
public:
SensorManager();
~SensorManager();
........
// 强引用类型。在创建本地中的SensorManager类对象时,自动强引用SensorService,自动调用onFirstRef方法【见详解】
mutable sp<ISensorServer> mSensorServer;
........
}
// getInstance函数的定义
// system/core/include/utils/Singleton.h
template <typename TYPE>
class ANDROID_API Singleton
{
public:
static TYPE& getInstance() {
Mutex::Autolock _l(sLock);
TYPE* instance = sInstance;
if (instance == 0) {
instance = new TYPE(); // 由此可得将会调用到TYPE的构造函数
sInstance = instance;
}
return *instance;
}
........
}
// frameworks/native/libs/gui/SensorManager.cpp
........
// 由上可得, SensorManager::getInstance()将会调用到此处
SensorManager::SensorManager()
: mSensorList(0) // 初始化mSensorList为0
{
assertStateLocked(); // 调用assertStateLocked函数
}
........
status_t SensorManager::assertStateLocked() const {
if (mSensorServer == NULL) { // 第一次进入的时候为true
// try for one second
const String16 name("sensorservice");
for (int i=0 ; i<4 ; i++) {
status_t err = getService(name, &mSensorServer); // 获得SensorService保存到mSensorServer成员变量中【见详解】
if (err == NAME_NOT_FOUND) {
usleep(250000);
continue;
}
if (err != NO_ERROR) {
return err;
}
break;
}
// 注册对SensorService的死亡监听器,SensorManager与SensorService对象将会同时销毁
class DeathObserver : public IBinder::DeathRecipient {
SensorManager& mSensorManger;
virtual void binderDied(const wp<IBinder>& who) {
ALOGW("sensorservice died [%p]", who.unsafe_get());
mSensorManger.sensorManagerDied();
}
public:
DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }
};
mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
mSensorServer->asBinder()->linkToDeath(mDeathObserver);
mSensors = mSensorServer->getSensorList(); // 提供mSensorServer的getSensorList方法来获取所有的Sensor
size_t count = mSensors.size();
mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*));
for (size_t i=0 ; i<count ; i++) {
mSensorList[i] = mSensors.array() + i; // 将所有的Sensor保存到mSensorList中
}
}
return NO_ERROR;
}
ssize_t SensorManager::getSensorList(Sensor const* const** list) const
{
Mutex::Autolock _l(mLock);
status_t err = assertStateLocked();
if (err < 0) {
return ssize_t(err);
}
*list = mSensorList; // 将assertStateLocked中获取的使用Sensor返回
return mSensors.size();
}
6.getService的实现
// frameworks/native/include/binder/IServiceManager.h
// defaultServiceManager的定义
sp<IServiceManager> defaultServiceManager();
// getService的定义
template<typename INTERFACE>
status_t getService(const String16& name, sp<INTERFACE>* outService)
{
const sp<IServiceManager> sm = defaultServiceManager(); // 调用defaultServiceManager()获取默认IServiceManager对象
if (sm != NULL) {
// 根据上面获取的IServiceManager对象以及name来获取服务,并保存到outService中
*outService = interface_cast<INTERFACE>(sm->getService(name));
if ((*outService) != NULL) return NO_ERROR;
}
return NAME_NOT_FOUND;
}
// frameworks/native/libs/binder/IServiceManager.c
// defaultServiceManager的实现
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
while (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
if (gDefaultServiceManager == NULL)
sleep(1);
}
}
return gDefaultServiceManager;
}
7.本地SensorService的定义
// frameworks/native/services/sensorservice/SensorService.h
class SensorService :
public BinderService<SensorService>,
public BnSensorServer,
protected Thread // 继承于线程
{
........
// Thread interface
virtual bool threadLoop(); // 调用run的时候将会调用此方法
........
}
// frameworks/native/services/sensorservice/SensorService.cpp
// SensorService构造函数
SensorService::SensorService()
: mInitCheck(NO_INIT), mSocketBufferSize(SOCKET_BUFFER_SIZE_NON_BATCHED),
mWakeLockAcquired(false)
{
}
// 由上面SensorManager中mSensorServer为强引用得,在第一次构造SensorService对象的时候会调用此函数
void SensorService::onFirstRef()
{
ALOGD("nuSensorService starting...");
SensorDevice& dev(SensorDevice::getInstance()); // 创建SensorDevice对象dev【见详解】
if (dev.initCheck() == NO_ERROR) {
sensor_t const* list;
ssize_t count = dev.getSensorList(&list); // 获得传感器设备列表并保存到list结构体中
if (count > 0) {
........
for (ssize_t i=0 ; i<count ; i++) {
registerSensor( new HardwareSensor(list[i]) ); // 注册在本地获得的传感器
........
}
........
mUserSensorList = mSensorList; // 将传感器列表保存到mUserSensorList中,用于客户端访问
if (hasGyro) { // 如果有陀螺仪设备,则先注册和陀螺仪有关的虚拟传感器设备
Sensor aSensor;
// Add Android virtual sensors if they're not already
// available in the HAL
// 虚拟旋转传感器
aSensor = registerVirtualSensor( new RotationVectorSensor() );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR)) {
mUserSensorList.add(aSensor);
}
// 虚拟重力传感器
aSensor = registerVirtualSensor( new GravitySensor(list, count) );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_GRAVITY)) {
mUserSensorList.add(aSensor);
}
// 虚拟加速传感器
aSensor = registerVirtualSensor( new LinearAccelerationSensor(list, count) );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_LINEAR_ACCELERATION)) {
mUserSensorList.add(aSensor);
}
// 虚拟方向传感器
aSensor = registerVirtualSensor( new OrientationSensor() );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR)) {
// if we are doing our own rotation-vector, also add
// the orientation sensor and remove the HAL provided one.
mUserSensorList.replaceAt(aSensor, orientationIndex);
}
// 真正陀螺仪传感器
registerVirtualSensor( new CorrectedGyroSensor(list, count) );
// 虚拟陀螺测漂传感器
registerVirtualSensor( new GyroDriftSensor() );
}
mUserSensorListDebug = mSensorList; // 将传感器列表保存到mUserSensorList中,用于调试
........
run("SensorService", PRIORITY_URGENT_DISPLAY); // 运行SensorService线程,调用threadLoop
}
}
}
........
bool SensorService::threadLoop()
{
........
do {
// 调用SensorDevice的poll方法,实现多路监听
ssize_t count = device.poll(mSensorEventBuffer, numEventMax);
........
// 记录poll返回的每一个传感器中的最后一个数据信息到mLastEventSeen中
recordLastValueLocked(mSensorEventBuffer, count);
// 处理虚拟传感器数据
if (count && vcount) {
sensors_event_t const * const event = mSensorEventBuffer;
// 虚拟传感器个数
const size_t activeVirtualSensorCount = mActiveVirtualSensors.size();
if (activeVirtualSensorCount) {
size_t k = 0;
SensorFusion& fusion(SensorFusion::getInstance());
if (fusion.isEnabled()) {
for (size_t i=0 ; i<size_t(count) ; i++) {
fusion.process(event[i]); // 处理虚拟传感器设备事件
}
}
........
}
}
........
size_t numConnections = activeConnections.size(); // 获得传感器连接对象列表数量
for (size_t i=0 ; i < numConnections; ++i) {
if (activeConnections[i] != 0) { // 向指定的传感器连接客户端发送传感器数据信息
activeConnections[i]->sendEvents(mSensorEventBuffer, count, mSensorEventScratch,
mMapFlushEventsToConnections);
needsWakeLock |= activeConnections[i]->needsWakeLock();
// If the connection has one-shot sensors, it may be cleaned up after first trigger.
// Early check for one-shot sensors.
if (activeConnections[i]->hasOneShotSensors()) {
cleanupAutoDisabledSensorLocked(activeConnections[i], mSensorEventBuffer,
count);
}
}
}
........
} while (!Thread::exitPending()); // 传感器循环监听线程
ALOGW("Exiting SensorService::threadLoop => aborting...");
abort();
return false;
}
// 注册传感器
Sensor SensorService::registerSensor(SensorInterface* s)
{
sensors_event_t event;
memset(&event, 0, sizeof(event));
const Sensor sensor(s->getSensor());
// add to the sensor list (returned to clients)
mSensorList.add(sensor); // 将注册的传感器保存到mSensorList中
// add to our handle->SensorInterface mapping
mSensorMap.add(sensor.getHandle(), s);
// create an entry in the mLastEventSeen array
mLastEventSeen.add(sensor.getHandle(), event);
return sensor;
}
........
// 获取所有的传感器
Vector<Sensor> SensorService::getSensorList()
{
char value[PROPERTY_VALUE_MAX];
property_get("debug.sensors", value, "0");
const Vector<Sensor>& initialSensorList = (atoi(value)) ?
mUserSensorListDebug : mUserSensorList; // 根据是否是debug模式来选择要过滤的传感器列表
Vector<Sensor> accessibleSensorList;
for (size_t i = 0; i < initialSensorList.size(); i++) {
Sensor sensor = initialSensorList[i];
if (canAccessSensor(sensor)) { // 将可访问的传感器添加到返回列表中
accessibleSensorList.add(sensor);
} else {
String8 infoMessage;
infoMessage.appendFormat(
"Skipped sensor %s because it requires permission %s",
sensor.getName().string(),
sensor.getRequiredPermission().string());
ALOGI(infoMessage.string());
}
}
return accessibleSensorList;
}
8.本地SensorDevice的定义
SensorDevice是在本地代码中SensorService对Sensor设备的抽象类型封装,
它封装了传感器硬件的硬件操作,该类继承了Singleton类,通过getInstance方法获得单例模式设备操作对象
// frameworks/native/services/sensorservice/SensorDevice.h
class SensorDevice : public Singleton<SensorDevice> { // 由此可见SensorDevice也是单例模式
friend class Singleton<SensorDevice>;
sensors_poll_device_1_t* mSensorDevice; // Sensor设备HAL层操作接口封装结构
struct sensors_module_t* mSensorModule; // Sensor设备HAL层硬件模块封装结构
........
DefaultKeyedVector<int, Info> mActivationCount; // 保存激活Sensor设备向量表
SensorDevice(); // 构造方法
public:
ssize_t getSensorList(sensor_t const** list); // 获得Sensor设备列表方法
status_t initCheck() const;
int getHalDeviceVersion() const;
ssize_t poll(sensors_event_t* buffer, size_t count); // Sensor设备多路监听方法
status_t activate(void* ident, int handle, int enabled); // 设备激活方法
status_t batch(void* ident, int handle, int flags, int64_t samplingPeriodNs,
int64_t maxBatchReportLatencyNs);
// Call batch with timeout zero instead of calling setDelay() for newer devices.
status_t setDelay(void* ident, int handle, int64_t ns); // 设备Sensor设备延迟方法
status_t flush(void* ident, int handle);
void autoDisable(void *ident, int handle);
void dump(String8& result);
};
// frameworks/native/services/sensorservice/SensorDevice.cpp
// 由Singleton中getInstance定义得,SensorDevice::getInstance()将会调用SensorDevice的构造函数
SensorDevice::SensorDevice()
: mSensorDevice(0),
mSensorModule(0)
{
// 调用hardware.h中的hw_get_module获取Sensor设备HAL层操作接口封装结构
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
ALOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorModule) {
// 打开module设备,返回module设备的操作接口,保存在mSensorDevice中 【见详情】
err = sensors_open_1(&mSensorModule->common, &mSensorDevice);
ALOGE_IF(err, "couldn't open device for module %s (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorDevice) {
if (mSensorDevice->common.version == SENSORS_DEVICE_API_VERSION_1_1 ||
mSensorDevice->common.version == SENSORS_DEVICE_API_VERSION_1_2) {
ALOGE(">>>> WARNING <<< Upgrade sensor HAL to version 1_3");
}
// 调用Sensor模块的get_sensors_list方法获得传感器列表
sensor_t const* list;
ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);
mActivationCount.setCapacity(count);
Info model;
for (size_t i=0 ; i<size_t(count) ; i++) {
// 依次激活这些设备并且添加到mActivationCount设备信息向量中
mActivationCount.add(list[i].handle, model);
mSensorDevice->activate(
reinterpret_cast<struct sensors_poll_device_t *>(mSensorDevice),
list[i].handle, 0);
}
}
}
}
........
// 获取传感器设备
ssize_t SensorDevice::getSensorList(sensor_t const** list) {
if (!mSensorModule) return NO_INIT;
ssize_t count = mSensorModule->get_sensors_list(mSensorModule, list);
return count;
}
// 检查SensorDevice是否初始化
status_t SensorDevice::initCheck() const {
return mSensorDevice && mSensorModule ? NO_ERROR : NO_INIT;
}
// 实现多路监听
ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) {
if (!mSensorDevice) return NO_INIT;
ssize_t c;
do {
c = mSensorDevice->poll(reinterpret_cast<struct sensors_poll_device_t *> (mSensorDevice),
buffer, count);
} while (c == -EINTR);
return c;
}
// sensors_open_1的定义与实现
// hardware/libhardware/include/hardware/sensors.h
........
// 各种传感器类型的定义
#define SENSOR_TYPE_META_DATA (0)
#define SENSOR_TYPE_ACCELEROMETER (1)
#define SENSOR_STRING_TYPE_ACCELEROMETER "android.sensor.accelerometer"
#define SENSOR_TYPE_GEOMAGNETIC_FIELD (2)
#define SENSOR_TYPE_MAGNETIC_FIELD SENSOR_TYPE_GEOMAGNETIC_FIELD
#define SENSOR_STRING_TYPE_MAGNETIC_FIELD "android.sensor.magnetic_field"
#define SENSOR_TYPE_ORIENTATION (3)
#define SENSOR_STRING_TYPE_ORIENTATION "android.sensor.orientation"
........
// 地球与太阳的重力常量
#define GRAVITY_SUN (275.0f)
#define GRAVITY_EARTH (9.80665f)
........
// 各种精度
#define SENSOR_STATUS_NO_CONTACT -1
#define SENSOR_STATUS_UNRELIABLE 0
#define SENSOR_STATUS_ACCURACY_LOW 1
#define SENSOR_STATUS_ACCURACY_MEDIUM 2
#define SENSOR_STATUS_ACCURACY_HIGH 3
// 表示不同传感器数据向量的结构体
typedef struct {
union {
float v[3]; // 使用3个浮点数据表示
struct { // 使用轴坐标表示
float x;
float y;
float z;
};
struct { // 使用极坐标表示
float azimuth;
float pitch;
float roll;
};
};
int8_t status; // 状态信息
uint8_t reserved[3];
} sensors_vec_t;
........
// 每个传感器的数据由sensors_event_t结构体表示
typedef struct sensors_event_t {
/* must be sizeof(struct sensors_event_t) */
int32_t version;
/* sensor identifier */
int32_t sensor;
/* sensor type */
int32_t type;
/* reserved */
int32_t reserved0;
........
} sensors_event_t;
/* see SENSOR_TYPE_META_DATA */
typedef sensors_event_t sensors_meta_data_event_t;
........
// 传感器模块的定义结构体
struct sensors_module_t {
struct hw_module_t common;
// 获取传感器的列表
int (*get_sensors_list)(struct sensors_module_t* module,
struct sensor_t const** list);
};
// 对任意一个sensor设备都会有一个sensor_t结构体
struct sensor_t {
/* Name of this sensor.
* All sensors of the same "type" must have a different "name".
*/
const char* name;
/* vendor of the hardware part */
const char* vendor;
/* version of the hardware part + driver. The value of this field
* must increase when the driver is updated in a way that changes the
* output of this sensor. This is important for fused sensors when the
* fusion algorithm is updated.
*/
int version;
........
};
// Sensor设备结构体,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t 结构体中
struct sensors_poll_device_t {
struct hw_device_t common;
int (*activate)(struct sensors_poll_device_t *dev,
int sensor_handle, int enabled);
int (*setDelay)(struct sensors_poll_device_t *dev,
int sensor_handle, int64_t sampling_period_ns);
// poll函数用来获取底层数据,调用时将被阻塞
int (*poll)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count);
};
........
// 制设备打开/关闭结构体定义如下
static inline int sensors_open(const struct hw_module_t* module,
struct sensors_poll_device_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}
static inline int sensors_close(struct sensors_poll_device_t* device) {
return device->common.close(&device->common);
}
static inline int sensors_open_1(const struct hw_module_t* module,
sensors_poll_device_1_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}
static inline int sensors_close_1(sensors_poll_device_1_t* device) {
return device->common.close(&device->common);
整个传感器调用过程为APP --> SensorManager.java --> SensorService.java --> SensorDevice -->sensor
1.传感器的使用
通常编写一个传感器的应用程序有以下步骤:
void sensorTest(Context context) {
// 定义传感器监听器
SensorEventListener sensorEventListener = new SensorEventListener() {
// 传感器数值发生变化时调用此函数
@Override
public void onSensorChanged(SensorEvent paramSensorEvent) {
}
// 传感器精度发生变化时调用此函数
@Override
public void onAccuracyChanged(Sensor paramSensor, int paramInt) {
}
};
// 获取封装了SensorService的SensorManager对象
SensorManager sm = (SensorManager) context.getSystemService(SENSOR_SERVICE);
// 获得指定类型的传感器对象
Sensor tempSensor = sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
// 注册传感器对象的监听器
sm.registerListener(sensorEventListener, tempSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
2.SensorManager的获取,由下面分析可得服务是在第一次调用的时候才创建的
在上例中通过Context.getSystemService(SENSOR_SERVICE);来获取Sensor系统服务.
getSystemService方法是在frameworks/base/core/java/android/content/Context.java中定义的抽象函数,
具体是在frameworks/base/core/java/android/app/ContextImpl.java中实现的,
class ContextImpl extends Context {
........
static class ServiceFetcher {
int mContextCacheIndex = -1;
// 从SYSTEM_SERVICE_MAP键值表查找与键值对应的对象ServiceFetcher
public Object getService(ContextImpl ctx) {
ArrayList<Object> cache = ctx.mServiceCache; // mServiceCache为服务的缓存
Object service;
synchronized (cache) {
if (cache.size() == 0) { // 第一次进入时没有对象,所以size()为0
// 初始化cache
for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
cache.add(null);
}
} else {
service = cache.get(mContextCacheIndex); // 从缓存中读取服务
if (service != null) {
return service;
}
}
service = createService(ctx); // 创建服务
cache.set(mContextCacheIndex, service); // 保存到缓存中
return service;
}
}
// 这个方法在子类中必须要重载,否则会在此抛异常
public Object createService(ContextImpl ctx) {
throw new RuntimeException("Not implemented");
}
}
........
private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new HashMap<String, ServiceFetcher>(); // 定义SYSTEM_SERVICE_MAP哈希键值映射表
private static int sNextPerContextServiceCacheIndex = 0; // sNextPerContextServiceCacheIndex为Android服务的索引值
private static void registerService(String serviceName, ServiceFetcher fetcher) {// 注册服务
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher); // 为哈希键值表SYSTEM_SERVICE_MAP赋值
}
static { // 静态注册三十多个服务
........
registerService(SENSOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new SystemSensorManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler().getLooper()); // 此处用的是主线程的looper,共享消息队列
}});
........
}
........
final ArrayList<Object> mServiceCache = new ArrayList<Object>(); // 定义mServiceCache,用于缓存服务
........
@Override
public Object getSystemService(String name) {
// 通过name获取哈希键值映射表SYSTEM_SERVICE_MAP中的值
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);}
}
3.SystemSensorManager对象创建过程
在上面注册的三十多个服务,其中就有一个是SensorManager的子类SystemSensorManager
// frameworks/base/core/java/android/hardware/SystemSensorManager.java
public class SystemSensorManager extends SensorManager {
private static native void nativeClassInit(); //【见详解】
private static native int nativeGetNextSensor(Sensor sensor, int next); // 【见详解】
private static boolean sSensorModuleInitialized = false; // 标志Sensor module是否已初始化
private static final Object sSensorModuleLock = new Object();
private static final ArrayList<Sensor> sFullSensorsList = new ArrayList<Sensor>();// Sensor缓存
........
private final Looper mMainLooper; // 保存主线程的Looper
private final int mTargetSdkLevel;
public SystemSensorManager(Context context, Looper mainLooper) {
mMainLooper = mainLooper; // 由上可得此处传入的是主线程Activity的Looper
mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
synchronized(sSensorModuleLock) {
if (!sSensorModuleInitialized) { // 如果Sensor module未初始化
sSensorModuleInitialized = true;
nativeClassInit(); // 调用本地方法初始化本地变量
// initialize the sensor list
final ArrayList<Sensor> fullList = sFullSensorsList; // sFullSensorsList用于保存下面创建的sensor
int i = 0;
do {
Sensor sensor = new Sensor(); // 创建Sensor对象
i = nativeGetNextSensor(sensor, i); // 调用本地方法初始化
if (i>=0) {
// 将创建的Sensor对象添加到缓存中
fullList.add(sensor);
sHandleToSensor.append(sensor.getHandle(), sensor);
}
} while (i>0);
}
}
}
@Override
protected List<Sensor> getFullSensorList() { // 获取Sensor缓存
return sFullSensorsList;
}
}
// SensorManager中getDefaultSensor的实现
// frameworks/base/core/java/android/hardware/SensorManager.java
public abstract class SensorManager {
........
private final SparseArray<List<Sensor>> mSensorListByType =
new SparseArray<List<Sensor>>(); // 稀疏数组mSensorListByType用于缓存前面获取过的传感器列表
private LegacySensorManager mLegacySensorManager;
// 以下定义了十几种传感器
public static final int SENSOR_ORIENTATION = 1 << 0;
public static final int SENSOR_ACCELEROMETER = 1 << 1;
public static final int SENSOR_TEMPERATURE = 1 << 2;
........
// 定义SensorListener#onSensorChanged获取到的数组中值的索引
public static final int DATA_X = 0;
public static final int DATA_Y = 1;
public static final int DATA_Z = 2;
........
// 定义各种物理常量
public static final float STANDARD_GRAVITY = 9.80665f;
public static final float GRAVITY_SUN = 275.0f;
public static final float GRAVITY_MERCURY = 3.70f;
........
// 定义获取传感器值的频率常量
public static final int SENSOR_DELAY_FASTEST = 0;
public static final int SENSOR_DELAY_GAME = 1;
public static final int SENSOR_DELAY_UI = 2;
public static final int SENSOR_DELAY_NORMAL = 3;
// 定义传感器精度相关的值
public static final int SENSOR_STATUS_NO_CONTACT = -1; // 未连接到传感器
public static final int SENSOR_STATUS_UNRELIABLE = 0; // 需要校准或者传感器不可读
public static final int SENSOR_STATUS_ACCURACY_LOW = 1; // 需要校准,精度低
public static final int SENSOR_STATUS_ACCURACY_MEDIUM = 2; // 平均精度,需要校准
public static final int SENSOR_STATUS_ACCURACY_HIGH = 3; // 精度高
........
// getFullSensorList的定义地方
protected abstract List<Sensor> getFullSensorList();
........
// 获取指定类型的传感器
public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list;
final List<Sensor> fullList = getFullSensorList(); // 调用子类中的getFullSensorList()方法
synchronized (mSensorListByType) {
list = mSensorListByType.get(type); // 从稀疏数组中获取传入的类型
if (list == null) { // 如果获取到结果不为空则直接返回,否则
if (type == Sensor.TYPE_ALL) { // 如果要获取的是全部传感器,则返回从子类中获取到的fullList
list = fullList;
} else { // 在子类中获取的传感器列表fullList中查找符合条件的传感器,并添加到稀疏数组mSensorListByType中
list = new ArrayList<Sensor>();
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
mSensorListByType.append(type, list);
}
}
return list;
}
public Sensor getDefaultSensor(int type) {
// 调用上面定义的getSensorList方法来获取指定类型的传感器列表
List<Sensor> l = getSensorList(type);
boolean wakeUpSensor = false;
// 以下类型的传感器需要直接唤醒
if (type == Sensor.TYPE_PROXIMITY || type == Sensor.TYPE_SIGNIFICANT_MOTION ||
type == Sensor.TYPE_TILT_DETECTOR || type == Sensor.TYPE_WAKE_GESTURE ||
type == Sensor.TYPE_GLANCE_GESTURE || type == Sensor.TYPE_PICK_UP_GESTURE) {
wakeUpSensor = true;
}
// 返回满足条件的第一个传感器
for (Sensor sensor : l) {
if (sensor.isWakeUpSensor() == wakeUpSensor) return sensor;
}
return null;
}
}
4.SensorManager对应的JNI方法
// frameworks/base/core/jni/android_hardware_SensorManager.cpp
........
static void nativeClassInit (JNIEnv *_env, jclass _this)
{
jclass sensorClass = _env->FindClass("android/hardware/Sensor"); // 获取Java框架层的Sensor类
SensorOffsets& sensorOffsets = gSensorOffsets; // 定义一个SensorOffsets结构体对象
// 将Java框架层的Sensor类中的成员保存在gSensorOffsets结构体中
sensorOffsets.name = _env->GetFieldID(sensorClass, "mName", "Ljava/lang/String;");
sensorOffsets.vendor = _env->GetFieldID(sensorClass, "mVendor", "Ljava/lang/String;");
sensorOffsets.version = _env->GetFieldID(sensorClass, "mVersion", "I");
sensorOffsets.handle = _env->GetFieldID(sensorClass, "mHandle", "I");
sensorOffsets.type = _env->GetFieldID(sensorClass, "mType", "I");
........
}
static jint nativeGetNextSensor(JNIEnv *env, jclass clazz, jobject sensor, jint next)
{
SensorManager& mgr(SensorManager::getInstance()); // 创建一个本地的SensorManager对象【见详解】
........
return size_t(next) < count ? next : 0;
}
........
// 定义java与c++方法对应函数表
static JNINativeMethod gSystemSensorManagerMethods[] = {
{"nativeClassInit",
"()V",
(void*)nativeClassInit },
{"nativeGetNextSensor",
"(Landroid/hardware/Sensor;I)I",
(void*)nativeGetNextSensor },
};
........
int register_android_hardware_SensorManager(JNIEnv *env)
{
// 注册上面定义的函数对应表
jniRegisterNativeMethods(env, "android/hardware/SystemSensorManager",
gSystemSensorManagerMethods, NELEM(gSystemSensorManagerMethods));
........
}
5.本地SensorManager的定义
// frameworks/base/include/gui/SensorManager.h
class SensorManager :
public ASensorManager,
public Singleton<SensorManager> // 继承单例模式
{
public:
SensorManager();
~SensorManager();
........
// 强引用类型。在创建本地中的SensorManager类对象时,自动强引用SensorService,自动调用onFirstRef方法【见详解】
mutable sp<ISensorServer> mSensorServer;
........
}
// getInstance函数的定义
// system/core/include/utils/Singleton.h
template <typename TYPE>
class ANDROID_API Singleton
{
public:
static TYPE& getInstance() {
Mutex::Autolock _l(sLock);
TYPE* instance = sInstance;
if (instance == 0) {
instance = new TYPE(); // 由此可得将会调用到TYPE的构造函数
sInstance = instance;
}
return *instance;
}
........
}
// frameworks/native/libs/gui/SensorManager.cpp
........
// 由上可得, SensorManager::getInstance()将会调用到此处
SensorManager::SensorManager()
: mSensorList(0) // 初始化mSensorList为0
{
assertStateLocked(); // 调用assertStateLocked函数
}
........
status_t SensorManager::assertStateLocked() const {
if (mSensorServer == NULL) { // 第一次进入的时候为true
// try for one second
const String16 name("sensorservice");
for (int i=0 ; i<4 ; i++) {
status_t err = getService(name, &mSensorServer); // 获得SensorService保存到mSensorServer成员变量中【见详解】
if (err == NAME_NOT_FOUND) {
usleep(250000);
continue;
}
if (err != NO_ERROR) {
return err;
}
break;
}
// 注册对SensorService的死亡监听器,SensorManager与SensorService对象将会同时销毁
class DeathObserver : public IBinder::DeathRecipient {
SensorManager& mSensorManger;
virtual void binderDied(const wp<IBinder>& who) {
ALOGW("sensorservice died [%p]", who.unsafe_get());
mSensorManger.sensorManagerDied();
}
public:
DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }
};
mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
mSensorServer->asBinder()->linkToDeath(mDeathObserver);
mSensors = mSensorServer->getSensorList(); // 提供mSensorServer的getSensorList方法来获取所有的Sensor
size_t count = mSensors.size();
mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*));
for (size_t i=0 ; i<count ; i++) {
mSensorList[i] = mSensors.array() + i; // 将所有的Sensor保存到mSensorList中
}
}
return NO_ERROR;
}
ssize_t SensorManager::getSensorList(Sensor const* const** list) const
{
Mutex::Autolock _l(mLock);
status_t err = assertStateLocked();
if (err < 0) {
return ssize_t(err);
}
*list = mSensorList; // 将assertStateLocked中获取的使用Sensor返回
return mSensors.size();
}
6.getService的实现
// frameworks/native/include/binder/IServiceManager.h
// defaultServiceManager的定义
sp<IServiceManager> defaultServiceManager();
// getService的定义
template<typename INTERFACE>
status_t getService(const String16& name, sp<INTERFACE>* outService)
{
const sp<IServiceManager> sm = defaultServiceManager(); // 调用defaultServiceManager()获取默认IServiceManager对象
if (sm != NULL) {
// 根据上面获取的IServiceManager对象以及name来获取服务,并保存到outService中
*outService = interface_cast<INTERFACE>(sm->getService(name));
if ((*outService) != NULL) return NO_ERROR;
}
return NAME_NOT_FOUND;
}
// frameworks/native/libs/binder/IServiceManager.c
// defaultServiceManager的实现
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
while (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
if (gDefaultServiceManager == NULL)
sleep(1);
}
}
return gDefaultServiceManager;
}
7.本地SensorService的定义
// frameworks/native/services/sensorservice/SensorService.h
class SensorService :
public BinderService<SensorService>,
public BnSensorServer,
protected Thread // 继承于线程
{
........
// Thread interface
virtual bool threadLoop(); // 调用run的时候将会调用此方法
........
}
// frameworks/native/services/sensorservice/SensorService.cpp
// SensorService构造函数
SensorService::SensorService()
: mInitCheck(NO_INIT), mSocketBufferSize(SOCKET_BUFFER_SIZE_NON_BATCHED),
mWakeLockAcquired(false)
{
}
// 由上面SensorManager中mSensorServer为强引用得,在第一次构造SensorService对象的时候会调用此函数
void SensorService::onFirstRef()
{
ALOGD("nuSensorService starting...");
SensorDevice& dev(SensorDevice::getInstance()); // 创建SensorDevice对象dev【见详解】
if (dev.initCheck() == NO_ERROR) {
sensor_t const* list;
ssize_t count = dev.getSensorList(&list); // 获得传感器设备列表并保存到list结构体中
if (count > 0) {
........
for (ssize_t i=0 ; i<count ; i++) {
registerSensor( new HardwareSensor(list[i]) ); // 注册在本地获得的传感器
........
}
........
mUserSensorList = mSensorList; // 将传感器列表保存到mUserSensorList中,用于客户端访问
if (hasGyro) { // 如果有陀螺仪设备,则先注册和陀螺仪有关的虚拟传感器设备
Sensor aSensor;
// Add Android virtual sensors if they're not already
// available in the HAL
// 虚拟旋转传感器
aSensor = registerVirtualSensor( new RotationVectorSensor() );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR)) {
mUserSensorList.add(aSensor);
}
// 虚拟重力传感器
aSensor = registerVirtualSensor( new GravitySensor(list, count) );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_GRAVITY)) {
mUserSensorList.add(aSensor);
}
// 虚拟加速传感器
aSensor = registerVirtualSensor( new LinearAccelerationSensor(list, count) );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_LINEAR_ACCELERATION)) {
mUserSensorList.add(aSensor);
}
// 虚拟方向传感器
aSensor = registerVirtualSensor( new OrientationSensor() );
if (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR)) {
// if we are doing our own rotation-vector, also add
// the orientation sensor and remove the HAL provided one.
mUserSensorList.replaceAt(aSensor, orientationIndex);
}
// 真正陀螺仪传感器
registerVirtualSensor( new CorrectedGyroSensor(list, count) );
// 虚拟陀螺测漂传感器
registerVirtualSensor( new GyroDriftSensor() );
}
mUserSensorListDebug = mSensorList; // 将传感器列表保存到mUserSensorList中,用于调试
........
run("SensorService", PRIORITY_URGENT_DISPLAY); // 运行SensorService线程,调用threadLoop
}
}
}
........
bool SensorService::threadLoop()
{
........
do {
// 调用SensorDevice的poll方法,实现多路监听
ssize_t count = device.poll(mSensorEventBuffer, numEventMax);
........
// 记录poll返回的每一个传感器中的最后一个数据信息到mLastEventSeen中
recordLastValueLocked(mSensorEventBuffer, count);
// 处理虚拟传感器数据
if (count && vcount) {
sensors_event_t const * const event = mSensorEventBuffer;
// 虚拟传感器个数
const size_t activeVirtualSensorCount = mActiveVirtualSensors.size();
if (activeVirtualSensorCount) {
size_t k = 0;
SensorFusion& fusion(SensorFusion::getInstance());
if (fusion.isEnabled()) {
for (size_t i=0 ; i<size_t(count) ; i++) {
fusion.process(event[i]); // 处理虚拟传感器设备事件
}
}
........
}
}
........
size_t numConnections = activeConnections.size(); // 获得传感器连接对象列表数量
for (size_t i=0 ; i < numConnections; ++i) {
if (activeConnections[i] != 0) { // 向指定的传感器连接客户端发送传感器数据信息
activeConnections[i]->sendEvents(mSensorEventBuffer, count, mSensorEventScratch,
mMapFlushEventsToConnections);
needsWakeLock |= activeConnections[i]->needsWakeLock();
// If the connection has one-shot sensors, it may be cleaned up after first trigger.
// Early check for one-shot sensors.
if (activeConnections[i]->hasOneShotSensors()) {
cleanupAutoDisabledSensorLocked(activeConnections[i], mSensorEventBuffer,
count);
}
}
}
........
} while (!Thread::exitPending()); // 传感器循环监听线程
ALOGW("Exiting SensorService::threadLoop => aborting...");
abort();
return false;
}
// 注册传感器
Sensor SensorService::registerSensor(SensorInterface* s)
{
sensors_event_t event;
memset(&event, 0, sizeof(event));
const Sensor sensor(s->getSensor());
// add to the sensor list (returned to clients)
mSensorList.add(sensor); // 将注册的传感器保存到mSensorList中
// add to our handle->SensorInterface mapping
mSensorMap.add(sensor.getHandle(), s);
// create an entry in the mLastEventSeen array
mLastEventSeen.add(sensor.getHandle(), event);
return sensor;
}
........
// 获取所有的传感器
Vector<Sensor> SensorService::getSensorList()
{
char value[PROPERTY_VALUE_MAX];
property_get("debug.sensors", value, "0");
const Vector<Sensor>& initialSensorList = (atoi(value)) ?
mUserSensorListDebug : mUserSensorList; // 根据是否是debug模式来选择要过滤的传感器列表
Vector<Sensor> accessibleSensorList;
for (size_t i = 0; i < initialSensorList.size(); i++) {
Sensor sensor = initialSensorList[i];
if (canAccessSensor(sensor)) { // 将可访问的传感器添加到返回列表中
accessibleSensorList.add(sensor);
} else {
String8 infoMessage;
infoMessage.appendFormat(
"Skipped sensor %s because it requires permission %s",
sensor.getName().string(),
sensor.getRequiredPermission().string());
ALOGI(infoMessage.string());
}
}
return accessibleSensorList;
}
8.本地SensorDevice的定义
SensorDevice是在本地代码中SensorService对Sensor设备的抽象类型封装,
它封装了传感器硬件的硬件操作,该类继承了Singleton类,通过getInstance方法获得单例模式设备操作对象
// frameworks/native/services/sensorservice/SensorDevice.h
class SensorDevice : public Singleton<SensorDevice> { // 由此可见SensorDevice也是单例模式
friend class Singleton<SensorDevice>;
sensors_poll_device_1_t* mSensorDevice; // Sensor设备HAL层操作接口封装结构
struct sensors_module_t* mSensorModule; // Sensor设备HAL层硬件模块封装结构
........
DefaultKeyedVector<int, Info> mActivationCount; // 保存激活Sensor设备向量表
SensorDevice(); // 构造方法
public:
ssize_t getSensorList(sensor_t const** list); // 获得Sensor设备列表方法
status_t initCheck() const;
int getHalDeviceVersion() const;
ssize_t poll(sensors_event_t* buffer, size_t count); // Sensor设备多路监听方法
status_t activate(void* ident, int handle, int enabled); // 设备激活方法
status_t batch(void* ident, int handle, int flags, int64_t samplingPeriodNs,
int64_t maxBatchReportLatencyNs);
// Call batch with timeout zero instead of calling setDelay() for newer devices.
status_t setDelay(void* ident, int handle, int64_t ns); // 设备Sensor设备延迟方法
status_t flush(void* ident, int handle);
void autoDisable(void *ident, int handle);
void dump(String8& result);
};
// frameworks/native/services/sensorservice/SensorDevice.cpp
// 由Singleton中getInstance定义得,SensorDevice::getInstance()将会调用SensorDevice的构造函数
SensorDevice::SensorDevice()
: mSensorDevice(0),
mSensorModule(0)
{
// 调用hardware.h中的hw_get_module获取Sensor设备HAL层操作接口封装结构
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
ALOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorModule) {
// 打开module设备,返回module设备的操作接口,保存在mSensorDevice中 【见详情】
err = sensors_open_1(&mSensorModule->common, &mSensorDevice);
ALOGE_IF(err, "couldn't open device for module %s (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorDevice) {
if (mSensorDevice->common.version == SENSORS_DEVICE_API_VERSION_1_1 ||
mSensorDevice->common.version == SENSORS_DEVICE_API_VERSION_1_2) {
ALOGE(">>>> WARNING <<< Upgrade sensor HAL to version 1_3");
}
// 调用Sensor模块的get_sensors_list方法获得传感器列表
sensor_t const* list;
ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);
mActivationCount.setCapacity(count);
Info model;
for (size_t i=0 ; i<size_t(count) ; i++) {
// 依次激活这些设备并且添加到mActivationCount设备信息向量中
mActivationCount.add(list[i].handle, model);
mSensorDevice->activate(
reinterpret_cast<struct sensors_poll_device_t *>(mSensorDevice),
list[i].handle, 0);
}
}
}
}
........
// 获取传感器设备
ssize_t SensorDevice::getSensorList(sensor_t const** list) {
if (!mSensorModule) return NO_INIT;
ssize_t count = mSensorModule->get_sensors_list(mSensorModule, list);
return count;
}
// 检查SensorDevice是否初始化
status_t SensorDevice::initCheck() const {
return mSensorDevice && mSensorModule ? NO_ERROR : NO_INIT;
}
// 实现多路监听
ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) {
if (!mSensorDevice) return NO_INIT;
ssize_t c;
do {
c = mSensorDevice->poll(reinterpret_cast<struct sensors_poll_device_t *> (mSensorDevice),
buffer, count);
} while (c == -EINTR);
return c;
}
// sensors_open_1的定义与实现
// hardware/libhardware/include/hardware/sensors.h
........
// 各种传感器类型的定义
#define SENSOR_TYPE_META_DATA (0)
#define SENSOR_TYPE_ACCELEROMETER (1)
#define SENSOR_STRING_TYPE_ACCELEROMETER "android.sensor.accelerometer"
#define SENSOR_TYPE_GEOMAGNETIC_FIELD (2)
#define SENSOR_TYPE_MAGNETIC_FIELD SENSOR_TYPE_GEOMAGNETIC_FIELD
#define SENSOR_STRING_TYPE_MAGNETIC_FIELD "android.sensor.magnetic_field"
#define SENSOR_TYPE_ORIENTATION (3)
#define SENSOR_STRING_TYPE_ORIENTATION "android.sensor.orientation"
........
// 地球与太阳的重力常量
#define GRAVITY_SUN (275.0f)
#define GRAVITY_EARTH (9.80665f)
........
// 各种精度
#define SENSOR_STATUS_NO_CONTACT -1
#define SENSOR_STATUS_UNRELIABLE 0
#define SENSOR_STATUS_ACCURACY_LOW 1
#define SENSOR_STATUS_ACCURACY_MEDIUM 2
#define SENSOR_STATUS_ACCURACY_HIGH 3
// 表示不同传感器数据向量的结构体
typedef struct {
union {
float v[3]; // 使用3个浮点数据表示
struct { // 使用轴坐标表示
float x;
float y;
float z;
};
struct { // 使用极坐标表示
float azimuth;
float pitch;
float roll;
};
};
int8_t status; // 状态信息
uint8_t reserved[3];
} sensors_vec_t;
........
// 每个传感器的数据由sensors_event_t结构体表示
typedef struct sensors_event_t {
/* must be sizeof(struct sensors_event_t) */
int32_t version;
/* sensor identifier */
int32_t sensor;
/* sensor type */
int32_t type;
/* reserved */
int32_t reserved0;
........
} sensors_event_t;
/* see SENSOR_TYPE_META_DATA */
typedef sensors_event_t sensors_meta_data_event_t;
........
// 传感器模块的定义结构体
struct sensors_module_t {
struct hw_module_t common;
// 获取传感器的列表
int (*get_sensors_list)(struct sensors_module_t* module,
struct sensor_t const** list);
};
// 对任意一个sensor设备都会有一个sensor_t结构体
struct sensor_t {
/* Name of this sensor.
* All sensors of the same "type" must have a different "name".
*/
const char* name;
/* vendor of the hardware part */
const char* vendor;
/* version of the hardware part + driver. The value of this field
* must increase when the driver is updated in a way that changes the
* output of this sensor. This is important for fused sensors when the
* fusion algorithm is updated.
*/
int version;
........
};
// Sensor设备结构体,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t 结构体中
struct sensors_poll_device_t {
struct hw_device_t common;
int (*activate)(struct sensors_poll_device_t *dev,
int sensor_handle, int enabled);
int (*setDelay)(struct sensors_poll_device_t *dev,
int sensor_handle, int64_t sampling_period_ns);
// poll函数用来获取底层数据,调用时将被阻塞
int (*poll)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count);
};
........
// 制设备打开/关闭结构体定义如下
static inline int sensors_open(const struct hw_module_t* module,
struct sensors_poll_device_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}
static inline int sensors_close(struct sensors_poll_device_t* device) {
return device->common.close(&device->common);
}
static inline int sensors_open_1(const struct hw_module_t* module,
sensors_poll_device_1_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}
static inline int sensors_close_1(sensors_poll_device_1_t* device) {
return device->common.close(&device->common);
}
0 0
- AndroidL 传感器系统
- AndroidL 系统属性的修改
- 获取系统传感器服务
- 调用系统距离传感器
- 传感器坐标系统
- Android 的传感器系统
- Android之传感器系统
- Android系统运动传感器
- 获取系统传感器
- AndroidL 源码编译 预置GMS包与第三方应用 系统属性管理
- Android之传感器系统(Gsensor)
- Android之传感器系统(Gsensor)
- Android之传感器系统(Gsensor) .
- Android之传感器系统(Gsensor)
- Android之传感器系统(Gsensor)
- Android Sensor传感器系统架构
- QtSensors传感器 系统兼容列表
- android studio 传感器之获取系统传感器信息
- python中的含有 *args 和**kwargs的用法 作为参数的函数,参数输入问题
- Linux如何通过PAM限制用户登录失败次数
- JavaSE+Thread
- git 命令
- Offline Image Viewer Guide
- AndroidL 传感器系统
- quartz.net
- SSL/TLS协议运行机制的概述
- 理论知识
- C++文件读写详解(ofstream,ifstream,fstream)
- php---ajax传递多维数组到后台
- DockPanel去掉右键默认的菜单的方法:在该类上添加WM_CONTEXTMENU消息即可
- C++primer plus第六版课后编程练习答案7.3
- C++操作BMP文件