summaryrefslogtreecommitdiffstats
path: root/libsensors
diff options
context:
space:
mode:
authorPawit Pornkitprasan <p.pawit@gmail.com>2011-07-29 23:04:14 +0700
committerPawit Pornkitprasan <p.pawit@gmail.com>2011-07-30 10:03:54 +0700
commit13d887d2950551fee4d8639a9b1cb164e307704e (patch)
treeb85023f9f192ee398815b70db2560d20eda69fb9 /libsensors
parenta8fb4a0032db58633914c3c2e3150aef28146a0b (diff)
downloaddevice_samsung_aries-common-13d887d2950551fee4d8639a9b1cb164e307704e.zip
device_samsung_aries-common-13d887d2950551fee4d8639a9b1cb164e307704e.tar.gz
device_samsung_aries-common-13d887d2950551fee4d8639a9b1cb164e307704e.tar.bz2
Fix orientation sensor.
Orientation sensor's daemon (orientationd) requires both accelerometer and magnetic sensor to be enabled in order to work. Change-Id: If34a5af1c55e9db8c3255786b1052e895afa7176
Diffstat (limited to 'libsensors')
-rw-r--r--libsensors/sensors.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/libsensors/sensors.cpp b/libsensors/sensors.cpp
index 23a1e34..1a128cb 100644
--- a/libsensors/sensors.cpp
+++ b/libsensors/sensors.cpp
@@ -147,6 +147,13 @@ private:
int mWritePipeFd;
SensorBase* mSensors[numSensorDrivers];
+ // For keeping track of usage (only count from system)
+ bool mAccelActive;
+ bool mMagnetActive;
+ bool mOrientationActive;
+
+ int real_activate(int handle, int enabled);
+
int handleToDriver(int handle) const {
switch (handle) {
@@ -205,6 +212,10 @@ sensors_poll_context_t::sensors_poll_context_t()
mPollFds[wake].fd = wakeFds[0];
mPollFds[wake].events = POLLIN;
mPollFds[wake].revents = 0;
+
+ mAccelActive = false;
+ mMagnetActive = false;
+ mOrientationActive = false;
}
sensors_poll_context_t::~sensors_poll_context_t() {
@@ -216,6 +227,36 @@ sensors_poll_context_t::~sensors_poll_context_t() {
}
int sensors_poll_context_t::activate(int handle, int enabled) {
+ int err;
+
+ // Orientation requires accelerometer and magnetic sensor
+ if (handle == ID_O) {
+ mOrientationActive = enabled ? true : false;
+ if (!mAccelActive) {
+ err = real_activate(ID_A, enabled);
+ if (err) return err;
+ }
+ if (!mMagnetActive) {
+ err = real_activate(ID_M, enabled);
+ if (err) return err;
+ }
+ }
+ // Keep track of magnetic and accelerometer use from system
+ else if (handle == ID_A) {
+ mAccelActive = enabled ? true : false;
+ // No need to enable or disable if orientation sensor is active as that will handle it
+ if (mOrientationActive) return 0;
+ }
+ else if (handle == ID_M) {
+ mMagnetActive = enabled ? true : false;
+ // No need to enable or disable if orientation sensor is active as that will handle it
+ if (mOrientationActive) return 0;
+ }
+
+ return real_activate(handle, enabled);
+}
+
+int sensors_poll_context_t::real_activate(int handle, int enabled) {
int index = handleToDriver(handle);
if (index < 0) return index;
int err = mSensors[index]->enable(handle, enabled);