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

Commit 4871f09f authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Native runtime sensors direct connection support.

When a direct channel is (un-)registered or configured, notify the
runtime sensor callback instead of the HAL and pass the shared memory
region to it. The SensorDirectConnection object is tied to a deviceId
and may only be configured for sensors of that device.

Only ashmem direct channel type is supported for runtime sensors.

Bug: 266042170
Test: atest CtsSensorTestCases

Change-Id: Ie1a628650bd94b6d81e95d3b9f8f25fcf445666c
parent 26b34d62
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -139,10 +139,12 @@ public:
    }

    virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
            uint32_t size, int32_t type, int32_t format, const native_handle_t *resource) {
            int deviceId, uint32_t size, int32_t type, int32_t format,
            const native_handle_t *resource) {
        Parcel data, reply;
        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
        data.writeString16(opPackageName);
        data.writeInt32(deviceId);
        data.writeUint32(size);
        data.writeInt32(type);
        data.writeInt32(format);
@@ -237,6 +239,7 @@ status_t BnSensorServer::onTransact(
        case CREATE_SENSOR_DIRECT_CONNECTION: {
            CHECK_INTERFACE(ISensorServer, data, reply);
            const String16& opPackageName = data.readString16();
            const int deviceId = data.readInt32();
            uint32_t size = data.readUint32();
            int32_t type = data.readInt32();
            int32_t format = data.readInt32();
@@ -246,8 +249,8 @@ status_t BnSensorServer::onTransact(
                return BAD_VALUE;
            }
            native_handle_set_fdsan_tag(resource);
            sp<ISensorEventConnection> ch =
                    createSensorDirectConnection(opPackageName, size, type, format, resource);
            sp<ISensorEventConnection> ch = createSensorDirectConnection(
                    opPackageName, deviceId, size, type, format, resource);
            native_handle_close_with_tag(resource);
            native_handle_delete(resource);
            reply->writeStrongBinder(IInterface::asBinder(ch));
+7 −1
Original line number Diff line number Diff line
@@ -315,6 +315,12 @@ bool SensorManager::isDataInjectionEnabled() {

int SensorManager::createDirectChannel(
        size_t size, int channelType, const native_handle_t *resourceHandle) {
    static constexpr int DEFAULT_DEVICE_ID = 0;
    return createDirectChannel(DEFAULT_DEVICE_ID, size, channelType, resourceHandle);
}

int SensorManager::createDirectChannel(
        int deviceId, size_t size, int channelType, const native_handle_t *resourceHandle) {
    Mutex::Autolock _l(mLock);
    if (assertStateLocked() != NO_ERROR) {
        return NO_INIT;
@@ -327,7 +333,7 @@ int SensorManager::createDirectChannel(
    }

    sp<ISensorEventConnection> conn =
              mSensorServer->createSensorDirectConnection(mOpPackageName,
              mSensorServer->createSensorDirectConnection(mOpPackageName, deviceId,
                  static_cast<uint32_t>(size),
                  static_cast<int32_t>(channelType),
                  SENSOR_DIRECT_FMT_SENSORS_EVENT, resourceHandle);
+2 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ public:
    virtual int32_t isDataInjectionEnabled() = 0;

    virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
            uint32_t size, int32_t type, int32_t format, const native_handle_t *resource) = 0;
            int deviceId, uint32_t size, int32_t type, int32_t format,
            const native_handle_t *resource) = 0;

    virtual int setOperationParameter(
            int32_t handle, int32_t type, const Vector<float> &floats, const Vector<int32_t> &ints) = 0;
+2 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ public:
        String8 packageName = String8(""), int mode = 0, String16 attributionTag = String16(""));
    bool isDataInjectionEnabled();
    int createDirectChannel(size_t size, int channelType, const native_handle_t *channelData);
    int createDirectChannel(
        int deviceId, size_t size, int channelType, const native_handle_t *channelData);
    void destroyDirectChannel(int channelNativeHandle);
    int configureDirectChannel(int channelNativeHandle, int sensorHandle, int rateLevel);
    int setOperationParameter(int handle, int type, const Vector<float> &floats, const Vector<int32_t> &ints);
+19 −15
Original line number Diff line number Diff line
@@ -28,10 +28,10 @@ using util::ProtoOutputStream;

SensorService::SensorDirectConnection::SensorDirectConnection(const sp<SensorService>& service,
        uid_t uid, const sensors_direct_mem_t *mem, int32_t halChannelHandle,
        const String16& opPackageName)
        const String16& opPackageName, int deviceId)
        : mService(service), mUid(uid), mMem(*mem),
        mHalChannelHandle(halChannelHandle),
        mOpPackageName(opPackageName), mDestroyed(false) {
        mOpPackageName(opPackageName), mDeviceId(deviceId), mDestroyed(false) {
    mUserId = multiuser_get_user_id(mUid);
    ALOGD_IF(DEBUG_CONNECTIONS, "Created SensorDirectConnection");
}
@@ -180,8 +180,7 @@ int32_t SensorService::SensorDirectConnection::configureChannel(int handle, int
    };

    Mutex::Autolock _l(mConnectionLock);
    SensorDevice& dev(SensorDevice::getInstance());
    int ret = dev.configureDirectChannel(handle, getHalChannelHandle(), &config);
    int ret = configure(handle, &config);

    if (rateLevel == SENSOR_DIRECT_RATE_STOP) {
        if (ret == NO_ERROR) {
@@ -224,7 +223,6 @@ void SensorService::SensorDirectConnection::capRates() {
    std::unordered_map<int, int>& existingConnections =
                    (!temporarilyStopped) ? mActivated : mActivatedBackup;

    SensorDevice& dev(SensorDevice::getInstance());
    for (auto &i : existingConnections) {
        int handle = i.first;
        int rateLevel = i.second;
@@ -239,8 +237,8 @@ void SensorService::SensorDirectConnection::capRates() {
                // Only reconfigure the channel if it's ongoing
                if (!temporarilyStopped) {
                    // Stopping before reconfiguring is the well-tested path in CTS
                    dev.configureDirectChannel(handle, getHalChannelHandle(), &stopConfig);
                    dev.configureDirectChannel(handle, getHalChannelHandle(), &capConfig);
                    configure(handle, &stopConfig);
                    configure(handle, &capConfig);
                }
            }
        }
@@ -258,7 +256,6 @@ void SensorService::SensorDirectConnection::uncapRates() {
    const struct sensors_direct_cfg_t stopConfig = {
        .rate_level = SENSOR_DIRECT_RATE_STOP
    };
    SensorDevice& dev(SensorDevice::getInstance());
    for (auto &i : mMicRateBackup) {
        int handle = i.first;
        int rateLevel = i.second;
@@ -273,13 +270,23 @@ void SensorService::SensorDirectConnection::uncapRates() {
        // Only reconfigure the channel if it's ongoing
        if (!temporarilyStopped) {
            // Stopping before reconfiguring is the well-tested path in CTS
            dev.configureDirectChannel(handle, getHalChannelHandle(), &stopConfig);
            dev.configureDirectChannel(handle, getHalChannelHandle(), &config);
            configure(handle, &stopConfig);
            configure(handle, &config);
        }
    }
    mMicRateBackup.clear();
}

int SensorService::SensorDirectConnection::configure(
        int handle, const sensors_direct_cfg_t* config) {
    if (mDeviceId == RuntimeSensor::DEFAULT_DEVICE_ID) {
        SensorDevice& dev(SensorDevice::getInstance());
        return dev.configureDirectChannel(handle, getHalChannelHandle(), config);
    } else {
        return mService->configureRuntimeSensorDirectChannel(handle, this, config);
    }
}

void SensorService::SensorDirectConnection::stopAll(bool backupRecord) {
    Mutex::Autolock _l(mConnectionLock);
    stopAllLocked(backupRecord);
@@ -290,9 +297,8 @@ void SensorService::SensorDirectConnection::stopAllLocked(bool backupRecord) {
        .rate_level = SENSOR_DIRECT_RATE_STOP
    };

    SensorDevice& dev(SensorDevice::getInstance());
    for (auto &i : mActivated) {
        dev.configureDirectChannel(i.first, getHalChannelHandle(), &config);
        configure(i.first, &config);
    }

    if (backupRecord && mActivatedBackup.empty()) {
@@ -306,8 +312,6 @@ void SensorService::SensorDirectConnection::recoverAll() {
    if (!mActivatedBackup.empty()) {
        stopAllLocked(false);

        SensorDevice& dev(SensorDevice::getInstance());

        // recover list of report from backup
        ALOG_ASSERT(mActivated.empty(),
                    "mActivated must be empty if mActivatedBackup was non-empty");
@@ -319,7 +323,7 @@ void SensorService::SensorDirectConnection::recoverAll() {
            struct sensors_direct_cfg_t config = {
                .rate_level = i.second
            };
            dev.configureDirectChannel(i.first, getHalChannelHandle(), &config);
            configure(i.first, &config);
        }
    }
}
Loading