diff options
author | Brian Stack <bstack@google.com> | 2019-01-25 11:22:04 -0800 |
---|---|---|
committer | Iliyan Malchev <malchev@google.com> | 2019-01-28 10:57:40 -0800 |
commit | a2d16bbc44adca41e4db2047b77e11b3e619cc87 (patch) | |
tree | d6da4504b95987fe6f175b7fb90121f20cea81d4 /sensors | |
parent | 543d779efa20cbdec9755489c47feb144b793d9a (diff) | |
download | android_hardware_interfaces-a2d16bbc44adca41e4db2047b77e11b3e619cc87.tar.gz android_hardware_interfaces-a2d16bbc44adca41e4db2047b77e11b3e619cc87.tar.bz2 android_hardware_interfaces-a2d16bbc44adca41e4db2047b77e11b3e619cc87.zip |
Add missing sensors to Sensors 2.0
Bug: 123380869
Test: atest com.android.devicehealthchecks.SensorsBootCheck#checkSensors
passes on Cuttlefish
Change-Id: I08a8406b3932469878da981add61f60b7774a377
Diffstat (limited to 'sensors')
-rw-r--r-- | sensors/2.0/default/Sensor.cpp | 185 | ||||
-rw-r--r-- | sensors/2.0/default/Sensor.h | 56 | ||||
-rw-r--r-- | sensors/2.0/default/Sensors.cpp | 13 | ||||
-rw-r--r-- | sensors/2.0/default/Sensors.h | 15 |
4 files changed, 261 insertions, 8 deletions
diff --git a/sensors/2.0/default/Sensor.cpp b/sensors/2.0/default/Sensor.cpp index 168b40219..373ab1280 100644 --- a/sensors/2.0/default/Sensor.cpp +++ b/sensors/2.0/default/Sensor.cpp @@ -131,9 +131,9 @@ std::vector<Event> Sensor::readEvents() { event.sensorHandle = mSensorInfo.sensorHandle; event.sensorType = mSensorInfo.type; event.timestamp = ::android::elapsedRealtimeNano(); - event.u.vec3.x = 1; - event.u.vec3.y = 2; - event.u.vec3.z = 3; + event.u.vec3.x = 0; + event.u.vec3.y = 0; + event.u.vec3.z = 0; event.u.vec3.status = SensorStatus::ACCURACY_HIGH; events.push_back(event); return events; @@ -166,6 +166,31 @@ Result Sensor::injectEvent(const Event& event) { return result; } +OnChangeSensor::OnChangeSensor(ISensorsEventCallback* callback) + : Sensor(callback), mPreviousEventSet(false) {} + +void OnChangeSensor::activate(bool enable) { + Sensor::activate(enable); + if (!enable) { + mPreviousEventSet = false; + } +} + +std::vector<Event> OnChangeSensor::readEvents() { + std::vector<Event> events = Sensor::readEvents(); + std::vector<Event> outputEvents; + + for (auto iter = events.begin(); iter != events.end(); ++iter) { + Event ev = *iter; + if (ev.u.vec3 != mPreviousEvent.u.vec3 || !mPreviousEventSet) { + outputEvents.push_back(ev); + mPreviousEvent = ev; + mPreviousEventSet = true; + } + } + return outputEvents; +} + AccelSensor::AccelSensor(int32_t sensorHandle, ISensorsEventCallback* callback) : Sensor(callback) { mSensorInfo.sensorHandle = sensorHandle; mSensorInfo.name = "Accel Sensor"; @@ -181,10 +206,162 @@ AccelSensor::AccelSensor(int32_t sensorHandle, ISensorsEventCallback* callback) mSensorInfo.fifoReservedEventCount = 0; mSensorInfo.fifoMaxEventCount = 0; mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = static_cast<uint32_t>(SensorFlagBits::DATA_INJECTION); +}; + +PressureSensor::PressureSensor(int32_t sensorHandle, ISensorsEventCallback* callback) + : Sensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Pressure Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::PRESSURE; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 1100.0f; // hPa + mSensorInfo.resolution = 1.0f; // hPa + mSensorInfo.power = 0.001f; // mA + mSensorInfo.minDelay = 28571.0f; // microseconds + mSensorInfo.maxDelay = 0.0f; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = 0; +}; + +MagnetometerSensor::MagnetometerSensor(int32_t sensorHandle, ISensorsEventCallback* callback) + : Sensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Magnetic Field Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::MAGNETIC_FIELD; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 4911.0f; + mSensorInfo.resolution = 1.00f; + mSensorInfo.power = 0.001f; // mA + mSensorInfo.minDelay = 14284.0f; // microseconds + mSensorInfo.maxDelay = 0.0f; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = 0; +}; + +LightSensor::LightSensor(int32_t sensorHandle, ISensorsEventCallback* callback) + : OnChangeSensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Light Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::LIGHT; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 10000.0f; + mSensorInfo.resolution = 10.0f; + mSensorInfo.power = 0.001f; // mA + mSensorInfo.minDelay = 20.0f * 1000; // microseconds + mSensorInfo.maxDelay = 0; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = static_cast<uint32_t>(SensorFlagBits::ON_CHANGE_MODE); +}; + +ProximitySensor::ProximitySensor(int32_t sensorHandle, ISensorsEventCallback* callback) + : OnChangeSensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Proximity Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::PROXIMITY; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 5.0f; + mSensorInfo.resolution = 1.0f; + mSensorInfo.power = 0.012f; // mA + mSensorInfo.minDelay = 500; // microseconds + mSensorInfo.maxDelay = 2 * mSensorInfo.minDelay; + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; mSensorInfo.flags = - static_cast<uint32_t>(SensorFlagBits::WAKE_UP | SensorFlagBits::DATA_INJECTION); + static_cast<uint32_t>(SensorFlagBits::ON_CHANGE_MODE | SensorFlagBits::WAKE_UP); +}; + +GyroSensor::GyroSensor(int32_t sensorHandle, ISensorsEventCallback* callback) : Sensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Gyro Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::GYROSCOPE; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 8.726639f; + mSensorInfo.resolution = 1.0f; + mSensorInfo.power = 0.001f; + mSensorInfo.minDelay = 4444; // microseonds + mSensorInfo.maxDelay = 0; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = 0; +}; + +AmbientTempSensor::AmbientTempSensor(int32_t sensorHandle, ISensorsEventCallback* callback) + : OnChangeSensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Ambient Temp Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::AMBIENT_TEMPERATURE; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 80.0f; + mSensorInfo.resolution = 1.0f; + mSensorInfo.power = 0.001f; + mSensorInfo.minDelay = 4444; // microseonds + mSensorInfo.maxDelay = 0; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = static_cast<uint32_t>(SensorFlagBits::ON_CHANGE_MODE); }; +DeviceTempSensor::DeviceTempSensor(int32_t sensorHandle, ISensorsEventCallback* callback) + : OnChangeSensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Device Temp Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::TEMPERATURE; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 80.0f; + mSensorInfo.resolution = 1.0f; + mSensorInfo.power = 0.001f; + mSensorInfo.minDelay = 4444; // microseonds + mSensorInfo.maxDelay = 0; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = static_cast<uint32_t>(SensorFlagBits::ON_CHANGE_MODE); +} + +RelativeHumiditySensor::RelativeHumiditySensor(int32_t sensorHandle, + ISensorsEventCallback* callback) + : OnChangeSensor(callback) { + mSensorInfo.sensorHandle = sensorHandle; + mSensorInfo.name = "Relative Humidity Sensor"; + mSensorInfo.vendor = "Vendor String"; + mSensorInfo.version = 1; + mSensorInfo.type = SensorType::RELATIVE_HUMIDITY; + mSensorInfo.typeAsString = ""; + mSensorInfo.maxRange = 100.0f; + mSensorInfo.resolution = 1.0f; + mSensorInfo.power = 0.001f; + mSensorInfo.minDelay = 4444; // microseonds + mSensorInfo.maxDelay = 0; // microseconds + mSensorInfo.fifoReservedEventCount = 0; + mSensorInfo.fifoMaxEventCount = 0; + mSensorInfo.requiredPermission = ""; + mSensorInfo.flags = static_cast<uint32_t>(SensorFlagBits::ON_CHANGE_MODE); +} + } // namespace implementation } // namespace V2_0 } // namespace sensors diff --git a/sensors/2.0/default/Sensor.h b/sensors/2.0/default/Sensor.h index 3ab2299a2..61900fa43 100644 --- a/sensors/2.0/default/Sensor.h +++ b/sensors/2.0/default/Sensor.h @@ -50,7 +50,7 @@ class Sensor { const SensorInfo& getSensorInfo() const; void batch(int32_t samplingPeriodNs); - void activate(bool enable); + virtual void activate(bool enable); Result flush(); void setOperationMode(OperationMode mode); @@ -79,11 +79,65 @@ class Sensor { OperationMode mMode; }; +class OnChangeSensor : public Sensor { + public: + OnChangeSensor(ISensorsEventCallback* callback); + + virtual void activate(bool enable) override; + + protected: + virtual std::vector<Event> readEvents() override; + + protected: + Event mPreviousEvent; + bool mPreviousEventSet; +}; + class AccelSensor : public Sensor { public: AccelSensor(int32_t sensorHandle, ISensorsEventCallback* callback); }; +class GyroSensor : public Sensor { + public: + GyroSensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class AmbientTempSensor : public OnChangeSensor { + public: + AmbientTempSensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class DeviceTempSensor : public OnChangeSensor { + public: + DeviceTempSensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class PressureSensor : public Sensor { + public: + PressureSensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class MagnetometerSensor : public Sensor { + public: + MagnetometerSensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class LightSensor : public OnChangeSensor { + public: + LightSensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class ProximitySensor : public OnChangeSensor { + public: + ProximitySensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + +class RelativeHumiditySensor : public OnChangeSensor { + public: + RelativeHumiditySensor(int32_t sensorHandle, ISensorsEventCallback* callback); +}; + } // namespace implementation } // namespace V2_0 } // namespace sensors diff --git a/sensors/2.0/default/Sensors.cpp b/sensors/2.0/default/Sensors.cpp index 15fe86f78..23dd26bcc 100644 --- a/sensors/2.0/default/Sensors.cpp +++ b/sensors/2.0/default/Sensors.cpp @@ -37,13 +37,20 @@ constexpr const char* kWakeLockName = "SensorsHAL_WAKEUP"; Sensors::Sensors() : mEventQueueFlag(nullptr), + mNextHandle(1), mOutstandingWakeUpEvents(0), mReadWakeLockQueueRun(false), mAutoReleaseWakeLockTime(0), mHasWakeLock(false) { - std::shared_ptr<AccelSensor> accel = - std::make_shared<AccelSensor>(1 /* sensorHandle */, this /* callback */); - mSensors[accel->getSensorInfo().sensorHandle] = accel; + AddSensor<AccelSensor>(); + AddSensor<GyroSensor>(); + AddSensor<AmbientTempSensor>(); + AddSensor<DeviceTempSensor>(); + AddSensor<PressureSensor>(); + AddSensor<MagnetometerSensor>(); + AddSensor<LightSensor>(); + AddSensor<ProximitySensor>(); + AddSensor<RelativeHumiditySensor>(); } Sensors::~Sensors() { diff --git a/sensors/2.0/default/Sensors.h b/sensors/2.0/default/Sensors.h index eba3f97a0..d06dd78da 100644 --- a/sensors/2.0/default/Sensors.h +++ b/sensors/2.0/default/Sensors.h @@ -87,6 +87,16 @@ struct Sensors : public ISensors, public ISensorsEventCallback { private: /** + * Add a new sensor + */ + template <class SensorType> + void AddSensor() { + std::shared_ptr<SensorType> sensor = + std::make_shared<SensorType>(mNextHandle++ /* sensorHandle */, this /* callback */); + mSensors[sensor->getSensorInfo().sensorHandle] = sensor; + } + + /** * Utility function to delete the Event Flag */ void deleteEventFlag(); @@ -132,6 +142,11 @@ struct Sensors : public ISensors, public ISensorsEventCallback { std::map<int32_t, std::shared_ptr<Sensor>> mSensors; /** + * The next available sensor handle + */ + int32_t mNextHandle; + + /** * Lock to protect writes to the FMQs */ std::mutex mWriteLock; |