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