Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 475d4d4d authored by Brian Stack's avatar Brian Stack
Browse files

Default implementation for initialize()

Implements the default initialize() function for Sensors HAL 2.0

Bug: 111070257
Test: Builds
Change-Id: I1d1f0d732d931adaf12ae40167eea484887fb140
parent 60fcdcf6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ cc_binary {
    shared_libs: [
        "android.hardware.sensors@1.0",
        "android.hardware.sensors@2.0",
        "libcutils",
        "libfmq",
        "libhidlbase",
        "libhidltransport",
        "liblog",
+46 −5
Original line number Diff line number Diff line
@@ -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::RateLevel;
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::activate(int32_t /* sensorHandle */, bool /* enabled */)
}

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> Sensors::configDirectReport(int32_t /* sensorHandle */, int32_t /*
    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
+38 −0
Original line number Diff line number Diff line
@@ -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 V2_0 {
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 @@ struct Sensors : public ISensors {
    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 @@ struct Sensors : public ISensors {

    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