1671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian/*
2671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * Copyright (C) 2010 The Android Open Source Project
3671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian *
4671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * you may not use this file except in compliance with the License.
6671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * You may obtain a copy of the License at
7671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian *
8671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian *
10671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * Unless required by applicable law or agreed to in writing, software
11671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * See the License for the specific language governing permissions and
14671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian * limitations under the License.
15671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian */
16671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
17671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian#include <stdint.h>
18671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian#include <math.h>
19671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian#include <sys/types.h>
20671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
21671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian#include <utils/Errors.h>
22671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
23671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian#include <hardware/sensors.h>
24671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
25671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian#include "LinearAccelerationSensor.h"
2673e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian#include "SensorDevice.h"
2773e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian#include "SensorFusion.h"
28671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
29671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopiannamespace android {
30671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian// ---------------------------------------------------------------------------
31671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
32671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias AgopianLinearAccelerationSensor::LinearAccelerationSensor(sensor_t const* list, size_t count)
33671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    : mSensorDevice(SensorDevice::getInstance()),
34671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian      mGravitySensor(list, count)
35671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian{
36671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian}
37671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
38671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopianbool LinearAccelerationSensor::process(sensors_event_t* outEvent,
39671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian        const sensors_event_t& event)
40671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian{
41671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    bool result = mGravitySensor.process(outEvent, event);
4273e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian    if (result && event.type == SENSOR_TYPE_ACCELEROMETER) {
4373e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian        outEvent->data[0] = event.acceleration.x - outEvent->data[0];
4473e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian        outEvent->data[1] = event.acceleration.y - outEvent->data[1];
4573e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian        outEvent->data[2] = event.acceleration.z - outEvent->data[2];
46671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian        outEvent->sensor = '_lin';
47671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian        outEvent->type = SENSOR_TYPE_LINEAR_ACCELERATION;
4873e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian        return true;
49671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    }
5073e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian    return false;
51671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian}
52671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
53671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopianstatus_t LinearAccelerationSensor::activate(void* ident, bool enabled) {
5473e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian    return mGravitySensor.activate(this, enabled);
55671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian}
56671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
57671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopianstatus_t LinearAccelerationSensor::setDelay(void* ident, int handle, int64_t ns) {
5873e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian    return mGravitySensor.setDelay(this, handle, ns);
59671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian}
60671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
61671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias AgopianSensor LinearAccelerationSensor::getSensor() const {
62671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    Sensor gsensor(mGravitySensor.getSensor());
63671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    sensor_t hwSensor;
64671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.name       = "Linear Acceleration Sensor";
65671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.vendor     = "Google Inc.";
6673e0bc805a143d8cc2202fccb73230459edc6869Mathias Agopian    hwSensor.version    = gsensor.getVersion();
67671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.handle     = '_lin';
68671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.type       = SENSOR_TYPE_LINEAR_ACCELERATION;
69671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.maxRange   = gsensor.getMaxValue();
70671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.resolution = gsensor.getResolution();
71671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.power      = gsensor.getPowerUsage();
72671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    hwSensor.minDelay   = gsensor.getMinDelay();
73671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    Sensor sensor(&hwSensor);
74671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian    return sensor;
75671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian}
76671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
77671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian// ---------------------------------------------------------------------------
78671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian}; // namespace android
79671a6ff4be11b3e2d8eb017e0c7a78e6133fb2b8Mathias Agopian
80