• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_SENSOR_SERVICE_H
18 #define ANDROID_SENSOR_SERVICE_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <utils/Vector.h>
24 #include <utils/SortedVector.h>
25 #include <utils/KeyedVector.h>
26 #include <utils/threads.h>
27 #include <utils/RefBase.h>
28 
29 #include <binder/BinderService.h>
30 
31 #include <gui/Sensor.h>
32 #include <gui/SensorChannel.h>
33 #include <gui/ISensorServer.h>
34 #include <gui/ISensorEventConnection.h>
35 
36 #include "SensorInterface.h"
37 
38 // ---------------------------------------------------------------------------
39 
40 #define DEBUG_CONNECTIONS   false
41 
42 struct sensors_poll_device_t;
43 struct sensors_module_t;
44 
45 namespace android {
46 // ---------------------------------------------------------------------------
47 
48 class SensorService :
49         public BinderService<SensorService>,
50         public BnSensorServer,
51         protected Thread
52 {
53    friend class BinderService<SensorService>;
54 
55    static const nsecs_t MINIMUM_EVENTS_PERIOD =   1000000; // 1000 Hz
56 
57             SensorService();
58     virtual ~SensorService();
59 
60     virtual void onFirstRef();
61 
62     // Thread interface
63     virtual bool threadLoop();
64 
65     // ISensorServer interface
66     virtual Vector<Sensor> getSensorList();
67     virtual sp<ISensorEventConnection> createSensorEventConnection();
68     virtual status_t dump(int fd, const Vector<String16>& args);
69 
70 
71     class SensorEventConnection : public BnSensorEventConnection {
72         virtual ~SensorEventConnection();
73         virtual void onFirstRef();
74         virtual sp<SensorChannel> getSensorChannel() const;
75         virtual status_t enableDisable(int handle, bool enabled);
76         virtual status_t setEventRate(int handle, nsecs_t ns);
77 
78         sp<SensorService> const mService;
79         sp<SensorChannel> const mChannel;
80         mutable Mutex mConnectionLock;
81 
82         // protected by SensorService::mLock
83         SortedVector<int> mSensorInfo;
84 
85     public:
86         SensorEventConnection(const sp<SensorService>& service);
87 
88         status_t sendEvents(sensors_event_t const* buffer, size_t count,
89                 sensors_event_t* scratch = NULL);
90         bool hasSensor(int32_t handle) const;
91         bool hasAnySensor() const;
92         bool addSensor(int32_t handle);
93         bool removeSensor(int32_t handle);
94     };
95 
96     class SensorRecord {
97         SortedVector< wp<SensorEventConnection> > mConnections;
98     public:
99         SensorRecord(const sp<SensorEventConnection>& connection);
100         bool addConnection(const sp<SensorEventConnection>& connection);
101         bool removeConnection(const wp<SensorEventConnection>& connection);
getNumConnections()102         size_t getNumConnections() const { return mConnections.size(); }
103     };
104 
105     SortedVector< wp<SensorEventConnection> > getActiveConnections() const;
106     DefaultKeyedVector<int, SensorInterface*> getActiveVirtualSensors() const;
107 
108     String8 getSensorName(int handle) const;
109     void recordLastValue(sensors_event_t const * buffer, size_t count);
110     static void sortEventBuffer(sensors_event_t* buffer, size_t count);
111     void registerSensor(SensorInterface* sensor);
112     void registerVirtualSensor(SensorInterface* sensor);
113 
114     // constants
115     Vector<Sensor> mSensorList;
116     Vector<Sensor> mUserSensorList;
117     DefaultKeyedVector<int, SensorInterface*> mSensorMap;
118     Vector<SensorInterface *> mVirtualSensorList;
119     status_t mInitCheck;
120 
121     // protected by mLock
122     mutable Mutex mLock;
123     DefaultKeyedVector<int, SensorRecord*> mActiveSensors;
124     DefaultKeyedVector<int, SensorInterface*> mActiveVirtualSensors;
125     SortedVector< wp<SensorEventConnection> > mActiveConnections;
126 
127     // The size of this vector is constant, only the items are mutable
128     KeyedVector<int32_t, sensors_event_t> mLastEventSeen;
129 
130 public:
getServiceName()131     static char const* getServiceName() { return "sensorservice"; }
132 
133     void cleanupConnection(SensorEventConnection* connection);
134     status_t enable(const sp<SensorEventConnection>& connection, int handle);
135     status_t disable(const sp<SensorEventConnection>& connection, int handle);
136     status_t setEventRate(const sp<SensorEventConnection>& connection, int handle, nsecs_t ns);
137 };
138 
139 // ---------------------------------------------------------------------------
140 }; // namespace android
141 
142 #endif // ANDROID_SENSOR_SERVICE_H
143