Loading sensors/2.0/default/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ cc_binary { shared_libs: [ "android.hardware.sensors@1.0", "android.hardware.sensors@2.0", "libcutils", "libfmq", "libhidlbase", "libhidltransport", "liblog", Loading sensors/2.0/default/Sensors.cpp +46 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "Sensors.h" #include <log/log.h> namespace android { namespace hardware { namespace sensors { Loading @@ -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 Loading @@ -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 */, Loading Loading @@ -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 Loading sensors/2.0/default/Sensors.h +38 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading
sensors/2.0/default/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ cc_binary { shared_libs: [ "android.hardware.sensors@1.0", "android.hardware.sensors@2.0", "libcutils", "libfmq", "libhidlbase", "libhidltransport", "liblog", Loading
sensors/2.0/default/Sensors.cpp +46 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "Sensors.h" #include <log/log.h> namespace android { namespace hardware { namespace sensors { Loading @@ -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 Loading @@ -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 */, Loading Loading @@ -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 Loading
sensors/2.0/default/Sensors.h +38 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading