blob: 61900fa43625335ee5f6fa0a5dada4b515b0826b [file] [log] [blame]
Brian Stack897528d2018-10-23 10:38:03 -07001/*
2 * Copyright (C) 2018 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_HARDWARE_SENSORS_V2_0_SENSOR_H
18#define ANDROID_HARDWARE_SENSORS_V2_0_SENSOR_H
19
20#include <android/hardware/sensors/1.0/types.h>
21
Brian Stack237abc62018-10-23 11:09:59 -070022#include <condition_variable>
23#include <memory>
Brian Stackd23f2002018-11-05 13:48:16 -080024#include <mutex>
Brian Stack237abc62018-10-23 11:09:59 -070025#include <thread>
26#include <vector>
27
28using ::android::hardware::sensors::V1_0::Event;
Brian Stackd23f2002018-11-05 13:48:16 -080029using ::android::hardware::sensors::V1_0::OperationMode;
Brian Stacke4f74c72018-10-29 11:51:46 -070030using ::android::hardware::sensors::V1_0::Result;
Brian Stack897528d2018-10-23 10:38:03 -070031using ::android::hardware::sensors::V1_0::SensorInfo;
Brian Stack237abc62018-10-23 11:09:59 -070032using ::android::hardware::sensors::V1_0::SensorType;
Brian Stack897528d2018-10-23 10:38:03 -070033
34namespace android {
35namespace hardware {
36namespace sensors {
37namespace V2_0 {
38namespace implementation {
39
Brian Stack237abc62018-10-23 11:09:59 -070040class ISensorsEventCallback {
41 public:
42 virtual ~ISensorsEventCallback(){};
Brian Stackf2aca3b2018-11-05 09:37:15 -080043 virtual void postEvents(const std::vector<Event>& events, bool wakeup) = 0;
Brian Stack237abc62018-10-23 11:09:59 -070044};
45
Brian Stack897528d2018-10-23 10:38:03 -070046class Sensor {
47 public:
Brian Stack237abc62018-10-23 11:09:59 -070048 Sensor(ISensorsEventCallback* callback);
49 virtual ~Sensor();
Brian Stack897528d2018-10-23 10:38:03 -070050
51 const SensorInfo& getSensorInfo() const;
Brian Stack237abc62018-10-23 11:09:59 -070052 void batch(int32_t samplingPeriodNs);
Brian Stacka2d16bb2019-01-25 11:22:04 -080053 virtual void activate(bool enable);
Brian Stacke4f74c72018-10-29 11:51:46 -070054 Result flush();
Brian Stack897528d2018-10-23 10:38:03 -070055
Brian Stackd23f2002018-11-05 13:48:16 -080056 void setOperationMode(OperationMode mode);
57 bool supportsDataInjection() const;
58 Result injectEvent(const Event& event);
59
Brian Stack897528d2018-10-23 10:38:03 -070060 protected:
Brian Stack237abc62018-10-23 11:09:59 -070061 void run();
62 virtual std::vector<Event> readEvents();
63 static void startThread(Sensor* sensor);
64
Brian Stackf2aca3b2018-11-05 09:37:15 -080065 bool isWakeUpSensor();
66
Brian Stack897528d2018-10-23 10:38:03 -070067 bool mIsEnabled;
68 int64_t mSamplingPeriodNs;
Brian Stack237abc62018-10-23 11:09:59 -070069 int64_t mLastSampleTimeNs;
Brian Stack897528d2018-10-23 10:38:03 -070070 SensorInfo mSensorInfo;
Brian Stack237abc62018-10-23 11:09:59 -070071
72 std::atomic_bool mStopThread;
73 std::condition_variable mWaitCV;
Brian Stackd23f2002018-11-05 13:48:16 -080074 std::mutex mRunMutex;
Brian Stack237abc62018-10-23 11:09:59 -070075 std::thread mRunThread;
76
77 ISensorsEventCallback* mCallback;
Brian Stackd23f2002018-11-05 13:48:16 -080078
79 OperationMode mMode;
Brian Stack897528d2018-10-23 10:38:03 -070080};
81
Brian Stacka2d16bb2019-01-25 11:22:04 -080082class OnChangeSensor : public Sensor {
83 public:
84 OnChangeSensor(ISensorsEventCallback* callback);
85
86 virtual void activate(bool enable) override;
87
88 protected:
89 virtual std::vector<Event> readEvents() override;
90
91 protected:
92 Event mPreviousEvent;
93 bool mPreviousEventSet;
94};
95
Brian Stack2927ab72018-10-23 11:22:55 -070096class AccelSensor : public Sensor {
97 public:
98 AccelSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
99};
100
Brian Stacka2d16bb2019-01-25 11:22:04 -0800101class GyroSensor : public Sensor {
102 public:
103 GyroSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
104};
105
106class AmbientTempSensor : public OnChangeSensor {
107 public:
108 AmbientTempSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
109};
110
111class DeviceTempSensor : public OnChangeSensor {
112 public:
113 DeviceTempSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
114};
115
116class PressureSensor : public Sensor {
117 public:
118 PressureSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
119};
120
121class MagnetometerSensor : public Sensor {
122 public:
123 MagnetometerSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
124};
125
126class LightSensor : public OnChangeSensor {
127 public:
128 LightSensor(int32_t sensorHandle, ISensorsEventCallback* callback);
129};
130
131class ProximitySensor : public OnChangeSensor {
132 public:
133 ProximitySensor(int32_t sensorHandle, ISensorsEventCallback* callback);
134};
135
136class RelativeHumiditySensor : public OnChangeSensor {
137 public:
138 RelativeHumiditySensor(int32_t sensorHandle, ISensorsEventCallback* callback);
139};
140
Brian Stack897528d2018-10-23 10:38:03 -0700141} // namespace implementation
142} // namespace V2_0
143} // namespace sensors
144} // namespace hardware
145} // namespace android
146
Brian Stack237abc62018-10-23 11:09:59 -0700147#endif // ANDROID_HARDWARE_SENSORS_V2_0_SENSOR_H