Default implementation for initialize()

Implements the default initialize() function for Sensors HAL 2.0

Bug: 111070257
Test: Builds
Change-Id: I1d1f0d732d931adaf12ae40167eea484887fb140
diff --git a/sensors/2.0/default/Android.bp b/sensors/2.0/default/Android.bp
index 45de61e..3bc64e5 100644
--- a/sensors/2.0/default/Android.bp
+++ b/sensors/2.0/default/Android.bp
@@ -26,6 +26,8 @@
     shared_libs: [
         "android.hardware.sensors@1.0",
         "android.hardware.sensors@2.0",
+        "libcutils",
+        "libfmq",
         "libhidlbase",
         "libhidltransport",
         "liblog",
diff --git a/sensors/2.0/default/Sensors.cpp b/sensors/2.0/default/Sensors.cpp
index 181349d..ea6e000 100644
--- a/sensors/2.0/default/Sensors.cpp
+++ b/sensors/2.0/default/Sensors.cpp
@@ -16,6 +16,8 @@
 
 #include "Sensors.h"
 
+#include <log/log.h>
+
 namespace android {
 namespace hardware {
 namespace sensors {
@@ -28,6 +30,12 @@
 using ::android::hardware::sensors::V1_0::Result;
 using ::android::hardware::sensors::V1_0::SharedMemInfo;
 
+Sensors::Sensors() : mEventQueueFlag(nullptr) {}
+
+Sensors::~Sensors() {
+    deleteEventFlag();
+}
+
 // Methods from ::android::hardware::sensors::V2_0::ISensors follow.
 Return<void> Sensors::getSensorsList(getSensorsList_cb /* _hidl_cb */) {
     // TODO implement
@@ -45,11 +53,37 @@
 }
 
 Return<Result> Sensors::initialize(
-    const ::android::hardware::MQDescriptorSync<Event>& /* eventQueueDescriptor */,
-    const ::android::hardware::MQDescriptorSync<uint32_t>& /* wakeLockDescriptor */,
-    const sp<ISensorsCallback>& /* sensorsCallback */) {
-    // TODO implement
-    return Result{};
+    const ::android::hardware::MQDescriptorSync<Event>& eventQueueDescriptor,
+    const ::android::hardware::MQDescriptorSync<uint32_t>& wakeLockDescriptor,
+    const sp<ISensorsCallback>& sensorsCallback) {
+    Result result = Result::OK;
+
+    // Save a reference to the callback
+    mCallback = sensorsCallback;
+
+    // Create the Event FMQ from the eventQueueDescriptor. Reset the read/write positions.
+    mEventQueue =
+        std::make_unique<EventMessageQueue>(eventQueueDescriptor, true /* resetPointers */);
+
+    // Ensure that any existing EventFlag is properly deleted
+    deleteEventFlag();
+
+    // Create the EventFlag that is used to signal to the framework that sensor events have been
+    // written to the Event FMQ
+    if (EventFlag::createEventFlag(mEventQueue->getEventFlagWord(), &mEventQueueFlag) != OK) {
+        result = Result::BAD_VALUE;
+    }
+
+    // Create the Wake Lock FMQ that is used by the framework to communicate whenever WAKE_UP
+    // events have been successfully read and handled by the framework.
+    mWakeLockQueue =
+        std::make_unique<WakeLockMessageQueue>(wakeLockDescriptor, true /* resetPointers */);
+
+    if (!mCallback || !mEventQueue || !mWakeLockQueue || mEventQueueFlag == nullptr) {
+        result = Result::BAD_VALUE;
+    }
+
+    return result;
 }
 
 Return<Result> Sensors::batch(int32_t /* sensorHandle */, int64_t /* samplingPeriodNs */,
@@ -86,6 +120,13 @@
     return Void();
 }
 
+void Sensors::deleteEventFlag() {
+    status_t status = EventFlag::deleteEventFlag(&mEventQueueFlag);
+    if (status != OK) {
+        ALOGI("Failed to delete event flag: %d", status);
+    }
+}
+
 }  // namespace implementation
 }  // namespace V2_0
 }  // namespace sensors
diff --git a/sensors/2.0/default/Sensors.h b/sensors/2.0/default/Sensors.h
index 1596aa8..15a713a 100644
--- a/sensors/2.0/default/Sensors.h
+++ b/sensors/2.0/default/Sensors.h
@@ -18,9 +18,12 @@
 #define ANDROID_HARDWARE_SENSORS_V2_0_SENSORS_H
 
 #include <android/hardware/sensors/2.0/ISensors.h>
+#include <fmq/MessageQueue.h>
 #include <hidl/MQDescriptor.h>
 #include <hidl/Status.h>
 
+#include <memory>
+
 namespace android {
 namespace hardware {
 namespace sensors {
@@ -28,10 +31,13 @@
 namespace implementation {
 
 using ::android::sp;
+using ::android::hardware::EventFlag;
 using ::android::hardware::hidl_array;
 using ::android::hardware::hidl_memory;
 using ::android::hardware::hidl_string;
 using ::android::hardware::hidl_vec;
+using ::android::hardware::MessageQueue;
+using ::android::hardware::MQDescriptor;
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 
@@ -42,6 +48,9 @@
     using Result = ::android::hardware::sensors::V1_0::Result;
     using SharedMemInfo = ::android::hardware::sensors::V1_0::SharedMemInfo;
 
+    Sensors();
+    virtual ~Sensors();
+
     // Methods from ::android::hardware::sensors::V2_0::ISensors follow.
     Return<void> getSensorsList(getSensorsList_cb _hidl_cb) override;
 
@@ -68,6 +77,35 @@
 
     Return<void> configDirectReport(int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
                                     configDirectReport_cb _hidl_cb) override;
+
+   private:
+    /**
+     * Utility function to delete the Event Flag
+     */
+    void deleteEventFlag();
+
+    using EventMessageQueue = MessageQueue<Event, kSynchronizedReadWrite>;
+    using WakeLockMessageQueue = MessageQueue<uint32_t, kSynchronizedReadWrite>;
+
+    /**
+     * The Event FMQ where sensor events are written
+     */
+    std::unique_ptr<EventMessageQueue> mEventQueue;
+
+    /**
+     * The Wake Lock FMQ that is read to determine when the framework has handled WAKE_UP events
+     */
+    std::unique_ptr<WakeLockMessageQueue> mWakeLockQueue;
+
+    /**
+     * Event Flag to signal to the framework when sensor events are available to be read
+     */
+    EventFlag* mEventQueueFlag;
+
+    /**
+     * Callback for asynchronous events, such as dynamic sensor connections.
+     */
+    sp<ISensorsCallback> mCallback;
 };
 
 }  // namespace implementation