Home | History | Annotate | Download | only in gui
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <stdint.h>
     18 #include <sys/types.h>
     19 
     20 #include <utils/Errors.h>
     21 #include <utils/RefBase.h>
     22 #include <utils/Timers.h>
     23 
     24 #include <binder/Parcel.h>
     25 #include <binder/IInterface.h>
     26 
     27 #include <gui/ISensorEventConnection.h>
     28 #include <gui/BitTube.h>
     29 
     30 namespace android {
     31 // ----------------------------------------------------------------------------
     32 
     33 enum {
     34     GET_SENSOR_CHANNEL = IBinder::FIRST_CALL_TRANSACTION,
     35     ENABLE_DISABLE,
     36     SET_EVENT_RATE,
     37     FLUSH_SENSOR
     38 };
     39 
     40 class BpSensorEventConnection : public BpInterface<ISensorEventConnection>
     41 {
     42 public:
     43     BpSensorEventConnection(const sp<IBinder>& impl)
     44         : BpInterface<ISensorEventConnection>(impl)
     45     {
     46     }
     47 
     48     virtual ~BpSensorEventConnection();
     49 
     50     virtual sp<BitTube> getSensorChannel() const
     51     {
     52         Parcel data, reply;
     53         data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
     54         remote()->transact(GET_SENSOR_CHANNEL, data, &reply);
     55         return new BitTube(reply);
     56     }
     57 
     58     virtual status_t enableDisable(int handle, bool enabled, nsecs_t samplingPeriodNs,
     59                                    nsecs_t maxBatchReportLatencyNs, int reservedFlags)
     60     {
     61         Parcel data, reply;
     62         data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
     63         data.writeInt32(handle);
     64         data.writeInt32(enabled);
     65         data.writeInt64(samplingPeriodNs);
     66         data.writeInt64(maxBatchReportLatencyNs);
     67         data.writeInt32(reservedFlags);
     68         remote()->transact(ENABLE_DISABLE, data, &reply);
     69         return reply.readInt32();
     70     }
     71 
     72     virtual status_t setEventRate(int handle, nsecs_t ns)
     73     {
     74         Parcel data, reply;
     75         data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
     76         data.writeInt32(handle);
     77         data.writeInt64(ns);
     78         remote()->transact(SET_EVENT_RATE, data, &reply);
     79         return reply.readInt32();
     80     }
     81 
     82     virtual status_t flush() {
     83         Parcel data, reply;
     84         data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
     85         remote()->transact(FLUSH_SENSOR, data, &reply);
     86         return reply.readInt32();
     87     }
     88 };
     89 
     90 // Out-of-line virtual method definition to trigger vtable emission in this
     91 // translation unit (see clang warning -Wweak-vtables)
     92 BpSensorEventConnection::~BpSensorEventConnection() {}
     93 
     94 IMPLEMENT_META_INTERFACE(SensorEventConnection, "android.gui.SensorEventConnection");
     95 
     96 // ----------------------------------------------------------------------------
     97 
     98 status_t BnSensorEventConnection::onTransact(
     99     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    100 {
    101     switch(code) {
    102         case GET_SENSOR_CHANNEL: {
    103             CHECK_INTERFACE(ISensorEventConnection, data, reply);
    104             sp<BitTube> channel(getSensorChannel());
    105             channel->writeToParcel(reply);
    106             return NO_ERROR;
    107         }
    108         case ENABLE_DISABLE: {
    109             CHECK_INTERFACE(ISensorEventConnection, data, reply);
    110             int handle = data.readInt32();
    111             int enabled = data.readInt32();
    112             nsecs_t samplingPeriodNs = data.readInt64();
    113             nsecs_t maxBatchReportLatencyNs = data.readInt64();
    114             int reservedFlags = data.readInt32();
    115             status_t result = enableDisable(handle, enabled, samplingPeriodNs,
    116                                             maxBatchReportLatencyNs, reservedFlags);
    117             reply->writeInt32(result);
    118             return NO_ERROR;
    119         }
    120         case SET_EVENT_RATE: {
    121             CHECK_INTERFACE(ISensorEventConnection, data, reply);
    122             int handle = data.readInt32();
    123             nsecs_t ns = data.readInt64();
    124             status_t result = setEventRate(handle, ns);
    125             reply->writeInt32(result);
    126             return NO_ERROR;
    127         }
    128         case FLUSH_SENSOR: {
    129             CHECK_INTERFACE(ISensorEventConnection, data, reply);
    130             status_t result = flush();
    131             reply->writeInt32(result);
    132             return NO_ERROR;
    133         }
    134     }
    135     return BBinder::onTransact(code, data, reply, flags);
    136 }
    137 
    138 // ----------------------------------------------------------------------------
    139 }; // namespace android
    140