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

Commit 555bf410 authored by Peng Xu's avatar Peng Xu Committed by Android (Google) Code Review
Browse files

Merge "Add direct sensor report NDK API"

parents abe498d1 3b170173
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -170,14 +170,20 @@ LIBANDROID {
    ASensorEventQueue_getEvents;
    ASensorEventQueue_hasEvents;
    ASensorEventQueue_setEventRate;
    ASensorManager_configureDirectReport; # introduced=26
    ASensorManager_createEventQueue;
    ASensorManager_createHardwareBufferDirectChannel; # introduced=26
    ASensorManager_createSharedMemoryDirectChannel; # introduced=26
    ASensorManager_destroyDirectChannel; # introduced=26
    ASensorManager_destroyEventQueue;
    ASensorManager_getDefaultSensor;
    ASensorManager_getDefaultSensorEx; # introduced=21
    ASensorManager_getInstance;
    ASensorManager_getInstanceForPackage; # introduced=26
    ASensorManager_getSensorList;
    ASensor_getFifoMaxEventCount; # introduced=21
    ASensor_getFifoReservedEventCount; # introduced=21
    ASensor_getHighestDirectReportRateLevel; # introduced=26
    ASensor_getMinDelay;
    ASensor_getName;
    ASensor_getReportingMode; # introduced=21
@@ -185,6 +191,7 @@ LIBANDROID {
    ASensor_getStringType; # introduced=21
    ASensor_getType;
    ASensor_getVendor;
    ASensor_isDirectChannelTypeSupported; # introduced=26
    ASensor_isWakeUpSensor; # introduced=21
    ASharedMemory_create; # introduced=26
    ASharedMemory_getSize; # introduced=26
+104 −5
Original line number Diff line number Diff line
@@ -17,16 +17,17 @@
#define LOG_TAG "sensor"
#include <utils/Log.h>

#include <android/hardware_buffer.h>
#include <android/looper.h>
#include <android/sensor.h>

#include <utils/RefBase.h>
#include <utils/Looper.h>
#include <utils/Timers.h>

#include <android/sharedmem.h>
#include <cutils/native_handle.h>
#include <gui/Sensor.h>
#include <gui/SensorManager.h>
#include <gui/SensorEventQueue.h>
#include <utils/Looper.h>
#include <utils/RefBase.h>
#include <utils/Timers.h>

#include <poll.h>

@@ -38,6 +39,22 @@ using android::String8;
using android::String16;

/*****************************************************************************/
#define ERROR_INVALID_PARAMETER(message) ALOGE("%s: " message, __func__)

// frequently used check
#define RETURN_IF_MANAGER_IS_NULL(retval) do {\
        if (manager == nullptr) { \
            ERROR_INVALID_PARAMETER("manager cannot be NULL"); \
            return retval; \
        } \
    } while (false)
#define RETURN_IF_SENSOR_IS_NULL(retval) do {\
        if (sensor == nullptr) { \
            ERROR_INVALID_PARAMETER("sensor cannot be NULL"); \
            return retval; \
        } \
    } while (false)

ASensorManager* ASensorManager_getInstance()
{
    return ASensorManager_getInstanceForPackage(NULL);
@@ -103,6 +120,78 @@ int ASensorManager_destroyEventQueue(ASensorManager* manager,
    return 0;
}

int ASensorManager_createSharedMemoryDirectChannel(
        ASensorManager *manager, int fd, size_t size) {
    RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE);

    if (fd < 0) {
        ERROR_INVALID_PARAMETER("fd is invalid.");
        return android::BAD_VALUE;
    }

    if (size < sizeof(ASensorEvent)) {
        ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent).");
    }

    native_handle_t *resourceHandle = native_handle_create(1 /* nFd */, 0 /* nInt */);
    if (!resourceHandle) {
        return android::NO_MEMORY;
    }

    resourceHandle->data[0] = fd;
    int ret = static_cast<SensorManager *>(manager)->createDirectChannel(
            size, ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY, resourceHandle);
    native_handle_delete(resourceHandle);
    return ret;
}

int ASensorManager_createHardwareBufferDirectChannel(
        ASensorManager *manager, AHardwareBuffer const *buffer, size_t size) {
    RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE);

    if (buffer == nullptr) {
        ERROR_INVALID_PARAMETER("buffer cannot be NULL");
        return android::BAD_VALUE;
    }

    if (size < sizeof(ASensorEvent)) {
        ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent).");
    }

    const native_handle_t *resourceHandle = AHardwareBuffer_getNativeHandle(buffer);
    if (!resourceHandle) {
        return android::NO_MEMORY;
    }

    return static_cast<SensorManager *>(manager)->createDirectChannel(
            size, ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER, resourceHandle);
}

void ASensorManager_destroyDirectChannel(ASensorManager *manager, int channelId) {
    RETURN_IF_MANAGER_IS_NULL(void());

    static_cast<SensorManager *>(manager)->destroyDirectChannel(channelId);
}

int ASensorManager_configureDirectReport(
        ASensorManager *manager, ASensor const *sensor, int channelId, int rate) {
    RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE);

    int sensorHandle;
    if (sensor == nullptr) {
        if (rate != ASENSOR_DIRECT_RATE_STOP) {
            ERROR_INVALID_PARAMETER(
                "sensor cannot be null when rate is not ASENSOR_DIRECT_RATE_STOP");
            return android::BAD_VALUE;
        }
        sensorHandle = -1;
    } else {
        sensorHandle = static_cast<Sensor const *>(sensor)->getHandle();
    }
    return static_cast<SensorManager *>(manager)->configureDirectChannel(
            channelId, sensorHandle, rate);
}

/*****************************************************************************/

int ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor,
@@ -211,3 +300,13 @@ bool ASensor_isWakeUpSensor(ASensor const* sensor)
{
    return static_cast<Sensor const*>(sensor)->isWakeUpSensor();
}

bool ASensor_isDirectChannelTypeSupported(ASensor const *sensor, int channelType) {
    RETURN_IF_SENSOR_IS_NULL(false);
    return static_cast<Sensor const *>(sensor)->isDirectChannelTypeSupported(channelType);
}

int ASensor_getHighestDirectReportRateLevel(ASensor const *sensor) {
    RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP);
    return static_cast<Sensor const *>(sensor)->getHighestDirectReportRateLevel();
}