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

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

Merge "[sensors] new functions and types for direct report mode"

parents 89515ca7 0f0df7ed
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -121,4 +121,60 @@ interface ISensors {
     *         BAD_VALUE if sensor event cannot be injected
     */
    injectSensorData(Event event) generates (Result result);

    /*
     * Register direct report channel.
     *
     * Register a direct channel with supplied shared memory information. Upon
     * return, the sensor hardware is responsible for resetting the memory
     * content to initial value (depending on memory format settings).
     *
     * @param   mem shared memory info data structure.
     * @return  result OK on success; BAD_VALUE if shared memory information is
     *          not consistent; NO_MEMORY if shared memory cannot be used by
     *          sensor system; INVALID_OPERATION if functionality is not
     *          supported.
     * @return  channelHandle a positive integer used for referencing registered
     *          direct channel (>0) in configureDirectReport and
     *          unregisterDirectChannel if result is OK, -1 otherwise.
     */
    registerDirectChannel(SharedMemInfo mem)
            generates (Result result, int32_t channelHandle);

    /*
     * Unregister direct report channel.
     *
     * Unregister a direct channel previously registered using
     * registerDirectChannel. If there is still active sensor report configured
     * in the direct channel, HAL should remove them.
     *
     * @param   channelHandle handle of direct channel to be unregistered.
     * @return  result OK if direct report is supported; INVALID_OPERATION
     *          otherwise.
     */
    unregisterDirectChannel(int32_t channelHandle) generates (Result result);

    /*
     * Configure direct sensor event report in direct channel.
     *
     * This function start, modify rate or stop direct report of a sensor in a
     * certain direct channel.
     *
     * @param   sensorHandle handle of sensor to be configured. When combined
     *          with STOP rate, sensorHandle can be -1 to denote all active
     *          sensors in the direct channel specified by channel Handle.
     * @param   channelHandle handle of direct channel to be configured.
     * @param   rate rate level, see RateLevel enum.
     *
     * @return  result OK on success; BAD_VALUE if parameter is invalid (such as
     *          rate level is not supported by sensor, channelHandle does not
     *          exist, etc); INVALID_OPERATION if functionality is not
     *          supported.
     * @return  reportToken positive integer to identify multiple sensors of
     *          the same type in a single direct channel. Ignored if rate is
     *          STOP. See SharedMemFormat.
     */
    configDirectReport(
            int32_t sensorHandle, int32_t channelHandle, RateLevel rate)
            generates (Result result, int32_t reportToken);
};
+26 −0
Original line number Diff line number Diff line
@@ -234,6 +234,32 @@ Return<Result> Sensors::injectSensorData(const Event& event) {
            mSensorDevice->inject_sensor_data(mSensorDevice, &out));
}

Return<void> Sensors::registerDirectChannel(
        const SharedMemInfo& mem, registerDirectChannel_cb _aidl_cb) {
    //TODO(b/30985702): finish implementation
    (void) mem;
    _aidl_cb(Result::INVALID_OPERATION, -1);
    return Void();
}

Return<Result> Sensors::unregisterDirectChannel(int32_t channelHandle) {
    //TODO(b/30985702): finish implementation
    (void) channelHandle;
    return Result::INVALID_OPERATION;
}

Return<void> Sensors::configDirectReport(
        int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
        configDirectReport_cb _hidl_cb) {
    //TODO(b/30985702): finish implementation
    (void) sensorHandle;
    (void) channelHandle;
    (void) rate;

    _hidl_cb(Result::INVALID_OPERATION, -1);
    return Void();
}

// static
void Sensors::convertFromSensorEvents(
        size_t count,
+9 −0
Original line number Diff line number Diff line
@@ -54,6 +54,15 @@ struct Sensors : public ::android::hardware::sensors::V1_0::ISensors {

    Return<Result> injectSensorData(const Event& event) override;

    Return<void> registerDirectChannel(
            const SharedMemInfo& mem, registerDirectChannel_cb _aidl_cb) override;

    Return<Result> unregisterDirectChannel(int32_t channelHandle) override;

    Return<void> configDirectReport(
            int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
            configDirectReport_cb _hidl_cb) override;

private:
    status_t mInitCheck;
    sensors_module_t *mSensorModule;
+96 −3
Original line number Diff line number Diff line
@@ -25,9 +25,10 @@ package android.hardware.sensors@1.0;
/* Type enumerating various result codes returned from ISensors methods */
enum Result : int32_t {
    OK,
    BAD_VALUE,
    PERMISSION_DENIED,
    INVALID_OPERATION,
    PERMISSION_DENIED                   = -1,
    NO_MEMORY                           = -12,
    BAD_VALUE                           = -22,
    INVALID_OPERATION                   = -38,
};

/*
@@ -748,6 +749,35 @@ enum SensorFlagBits : uint64_t {
     * See ADDITIONAL_INFO and AdditionalInfo for details.
     */
    SENSOR_FLAG_ADDITIONAL_INFO             = 0x40,

    /*
     * Set this flag if sensor suppor direct channel backed by ashmem.
     * See SharedMemType and registerDirectChannel for more details.
     */
    SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM       = 0x400,

    /*
     * Set this flag if sensor suppor direct channel backed by gralloc HAL memory.
     * See SharedMemType and registerDirectChannel for more details.
     */
    SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC      = 0x800,

    /*
     * Flags mask for reporting mode of sensor.
     */
    SENSOR_FLAG_MASK_REPORTING_MODE         = 0xE,

    /*
     * Flags mask for direct report maximum rate level support.
     * See RateLevel.
     */
    SENSOR_FLAG_MASK_DIRECT_REPORT          = 0x380,

    /*
     * Flags mask for all direct channel support bits.
     * See SharedMemType.
     */
    SENSOR_FLAG_MASK_DIRECT_CHANNEL         = 0xC00,
};

struct SensorInfo {
@@ -1085,3 +1115,66 @@ struct Event {
    /* Union discriminated on sensorType */
    EventPayload u;
};

/**
 * Direct report rate level definition. Except for SENSOR_DIRECT_RATE_STOP, each
 * rate level covers the range (55%, 220%] * nominal report rate. For example,
 * if config direct report specify a rate level SENSOR_DIRECT_RATE_FAST, sensor
 * hardware should report event at a rate greater than 110Hz, and less or equal
 * to 440Hz.
 */
@export(name="direct_rate_level_t", value_prefix="SENSOR_DIRECT_RATE_")
enum RateLevel : int32_t {
    STOP,            // stop
    NORMAL,          // nominal 50Hz
    FAST,            // nominal 200Hz
    VERY_FAST,       // nominal 800Hz
};

/**
 * Direct channel shared memory types. See struct SharedMemInfo.
 */
@export(name="direct_mem_type_t", value_prefix="SENSOR_DIRECT_MEM_TYPE_")
enum SharedMemType : int32_t {
    // handle contains 1 fd (ashmem handle) and 0 int.
    ASHMEM = 1,
    // handle definition matches gralloc HAL.
    GRALLOC
};


/**
 * Direct channel lock-free queue format, this defines how the shared memory
 * should be interpreted by both sensor hardware and application. See struct
 * SharedMemInfo.
 */
@export(name="direct_format_t", value_prefix="SENSOR_DIRECT_FMT_")
enum SharedMemFormat : int32_t {
    SENSORS_EVENT = 1,  // shared memory is formated as an array of data
                        // elements, each sized 104 bytes. Details of fields:
                        //
                        // offset   type        name
                        //-----------------------------------
                        // 0x0000   int32_t     size (always 104)
                        // 0x0004   int32_t     sensor report token
                        // 0x0008   int32_t     type (see SensorType)
                        // 0x000C   int32_t     atomic counter
                        // 0x0010   int64_t     timestamp (see Event)
                        // 0x0014   float[16]/  data
                        //          int64_t[8]
                        // 0x0058   int32_t[4]  reserved
                        //
                        // Upon return of channel registration call, the
                        // shared memory space must be formated to all 0 by HAL.
};

/**
 * Shared memory information for a direct channel
 */
struct SharedMemInfo {
    SharedMemType type;         // shared memory type
    SharedMemFormat format;
    uint32_t size;              // size of the memory region, in bytes
    handle memoryHandle;        // shared memory handle, it is interpreted
                                // depending on type field, see SharedMemType.
};