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 <sensor/ISensorEventConnection.h> 18 19 #include <stdint.h> 20 #include <sys/types.h> 21 22 #include <utils/Errors.h> 23 #include <utils/RefBase.h> 24 #include <utils/Timers.h> 25 26 #include <binder/Parcel.h> 27 #include <binder/IInterface.h> 28 29 #include <sensor/BitTube.h> 30 31 namespace android { 32 // ---------------------------------------------------------------------------- 33 34 enum { 35 GET_SENSOR_CHANNEL = IBinder::FIRST_CALL_TRANSACTION, 36 ENABLE_DISABLE, 37 SET_EVENT_RATE, 38 FLUSH_SENSOR, 39 CONFIGURE_CHANNEL, 40 DESTROY, 41 }; 42 43 class BpSensorEventConnection : public BpInterface<ISensorEventConnection> 44 { 45 public: 46 explicit BpSensorEventConnection(const sp<IBinder>& impl) 47 : BpInterface<ISensorEventConnection>(impl) 48 { 49 } 50 51 virtual ~BpSensorEventConnection(); 52 53 virtual sp<BitTube> getSensorChannel() const 54 { 55 Parcel data, reply; 56 data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); 57 remote()->transact(GET_SENSOR_CHANNEL, data, &reply); 58 return new BitTube(reply); 59 } 60 61 virtual status_t enableDisable(int handle, bool enabled, nsecs_t samplingPeriodNs, 62 nsecs_t maxBatchReportLatencyNs, int reservedFlags) 63 { 64 Parcel data, reply; 65 data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); 66 data.writeInt32(handle); 67 data.writeInt32(enabled); 68 data.writeInt64(samplingPeriodNs); 69 data.writeInt64(maxBatchReportLatencyNs); 70 data.writeInt32(reservedFlags); 71 remote()->transact(ENABLE_DISABLE, data, &reply); 72 return reply.readInt32(); 73 } 74 75 virtual status_t setEventRate(int handle, nsecs_t ns) 76 { 77 Parcel data, reply; 78 data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); 79 data.writeInt32(handle); 80 data.writeInt64(ns); 81 remote()->transact(SET_EVENT_RATE, data, &reply); 82 return reply.readInt32(); 83 } 84 85 virtual status_t flush() { 86 Parcel data, reply; 87 data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); 88 remote()->transact(FLUSH_SENSOR, data, &reply); 89 return reply.readInt32(); 90 } 91 92 virtual int32_t configureChannel(int32_t handle, int32_t rateLevel) { 93 Parcel data, reply; 94 data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor()); 95 data.writeInt32(handle); 96 data.writeInt32(rateLevel); 97 remote()->transact(CONFIGURE_CHANNEL, data, &reply); 98 return reply.readInt32(); 99 } 100 101 virtual void onLastStrongRef(const void* id) { 102 destroy(); 103 BpInterface<ISensorEventConnection>::onLastStrongRef(id); 104 } 105 106 protected: 107 virtual void destroy() { 108 Parcel data, reply; 109 remote()->transact(DESTROY, data, &reply); 110 } 111 }; 112 113 // Out-of-line virtual method definition to trigger vtable emission in this 114 // translation unit (see clang warning -Wweak-vtables) 115 BpSensorEventConnection::~BpSensorEventConnection() { } 116 117 IMPLEMENT_META_INTERFACE(SensorEventConnection, "android.gui.SensorEventConnection"); 118 119 // ---------------------------------------------------------------------------- 120 121 status_t BnSensorEventConnection::onTransact( 122 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 123 { 124 switch(code) { 125 case GET_SENSOR_CHANNEL: { 126 CHECK_INTERFACE(ISensorEventConnection, data, reply); 127 sp<BitTube> channel(getSensorChannel()); 128 channel->writeToParcel(reply); 129 return NO_ERROR; 130 } 131 case ENABLE_DISABLE: { 132 CHECK_INTERFACE(ISensorEventConnection, data, reply); 133 int handle = data.readInt32(); 134 int enabled = data.readInt32(); 135 nsecs_t samplingPeriodNs = data.readInt64(); 136 nsecs_t maxBatchReportLatencyNs = data.readInt64(); 137 int reservedFlags = data.readInt32(); 138 status_t result = enableDisable(handle, enabled, samplingPeriodNs, 139 maxBatchReportLatencyNs, reservedFlags); 140 reply->writeInt32(result); 141 return NO_ERROR; 142 } 143 case SET_EVENT_RATE: { 144 CHECK_INTERFACE(ISensorEventConnection, data, reply); 145 int handle = data.readInt32(); 146 nsecs_t ns = data.readInt64(); 147 status_t result = setEventRate(handle, ns); 148 reply->writeInt32(result); 149 return NO_ERROR; 150 } 151 case FLUSH_SENSOR: { 152 CHECK_INTERFACE(ISensorEventConnection, data, reply); 153 status_t result = flush(); 154 reply->writeInt32(result); 155 return NO_ERROR; 156 } 157 case CONFIGURE_CHANNEL: { 158 CHECK_INTERFACE(ISensorEventConnection, data, reply); 159 int handle = data.readInt32(); 160 int rateLevel = data.readInt32(); 161 status_t result = configureChannel(handle, rateLevel); 162 reply->writeInt32(result); 163 return NO_ERROR; 164 } 165 case DESTROY: { 166 destroy(); 167 return NO_ERROR; 168 } 169 170 } 171 return BBinder::onTransact(code, data, reply, flags); 172 } 173 174 // ---------------------------------------------------------------------------- 175 }; // namespace android 176