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

Commit 19f082eb authored by Mathias Agopian's avatar Mathias Agopian Committed by Android (Google) Code Review
Browse files

Merge "filter sensor event by connection" into gingerbread

parents 53d4e0d5 efba8bf5
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ namespace android {

/*
 * TODO:
 * - filter events per connection
 * - make sure to keep the last value of each event type so we can quickly
 *   send something to application when they enable a sensor that is already
 *   active (the issue here is that it can take time before a value is
@@ -162,6 +161,7 @@ bool SensorService::threadLoop()
    LOGD("nuSensorService thread starting...");

    sensors_event_t buffer[16];
    sensors_event_t scratch[16];
    struct sensors_poll_device_t* device = mSensorDevice;
    ssize_t count;

@@ -177,10 +177,11 @@ bool SensorService::threadLoop()

        size_t numConnections = activeConnections.size();
        if (numConnections) {
            Mutex::Autolock _l(mLock);
            for (size_t i=0 ; i<numConnections ; i++) {
                sp<SensorEventConnection> connection(activeConnections[i].promote());
                if (connection != 0) {
                    connection->sendEvents(buffer, count);
                    connection->sendEvents(buffer, count, scratch);
                }
            }
        }
@@ -425,12 +426,23 @@ status_t SensorService::SensorEventConnection::setEventRateLocked(
}

status_t SensorService::SensorEventConnection::sendEvents(
        sensors_event_t const* buffer, size_t count)
        sensors_event_t const* buffer, size_t numEvents,
        sensors_event_t* scratch)
{
    // TODO: we should only send the events for the sensors this connection
    // is registered for.
    // filter out events not for this connection
    size_t count=0, i=0;
    while (i<numEvents) {
        const int32_t curr = buffer[i].sensor;
        if (mSensorInfo.indexOfKey(curr) >= 0) {
            do {
                scratch[count++] = buffer[i++];
            } while ((i<numEvents) && (buffer[i].sensor == curr));
        } else {
            i++;
        }
    }

    ssize_t size = mChannel->write(buffer, count*sizeof(sensors_event_t));
    ssize_t size = mChannel->write(scratch, count*sizeof(sensors_event_t));
    if (size == -EAGAIN) {
        // the destination doesn't accept events anymore, it's probably
        // full. For now, we just drop the events on the floor.
+2 −3
Original line number Diff line number Diff line
@@ -77,8 +77,6 @@ class SensorService :
        sp<SensorChannel> const mChannel;

        // protected by SensorService::mLock
        //SortedVector<int32_t> mSensorList;

        struct SensorInfo {
            SensorInfo() : ns(DEFAULT_EVENTS_PERIOD) { }
            nsecs_t ns;
@@ -88,7 +86,8 @@ class SensorService :
    public:
        SensorEventConnection(const sp<SensorService>& service);

        status_t sendEvents(sensors_event_t const* buffer, size_t count);
        status_t sendEvents(sensors_event_t const* buffer, size_t count,
                sensors_event_t* scratch);
        bool hasSensor(int32_t handle) const;
        bool hasAnySensor() const;
        bool addSensor(int32_t handle);