1 /*
2 * Copyright (C) 2015 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 #define LOG_TAG "VehicleNetwork.Lib"
17
18 #include <binder/IServiceManager.h>
19 #include <binder/ProcessState.h>
20 #include <utils/threads.h>
21
22 #include <hardware/vehicle.h>
23
24 #include <VehicleNetwork.h>
25
26 namespace android {
27
VehicleNetworkEventMessageHandler(const sp<Looper> & looper,sp<VehicleNetworkListener> & listener)28 VehicleNetworkEventMessageHandler::VehicleNetworkEventMessageHandler(const sp<Looper>& looper,
29 sp<VehicleNetworkListener>& listener) :
30 mLooper(looper),
31 mListener(listener) {
32
33 }
34
~VehicleNetworkEventMessageHandler()35 VehicleNetworkEventMessageHandler::~VehicleNetworkEventMessageHandler() {
36 Mutex::Autolock autoLock(mLock);
37 mEvents.clear();
38 for (VehicleHalError* e : mHalErrors) {
39 delete e;
40 }
41 mHalErrors.clear();
42 mHalRestartEvents.clear();
43 }
44
handleHalEvents(sp<VehiclePropValueListHolder> & events)45 void VehicleNetworkEventMessageHandler::handleHalEvents(sp<VehiclePropValueListHolder>& events) {
46 Mutex::Autolock autoLock(mLock);
47 mEvents.push_back(events);
48 mLooper->sendMessage(this, Message(EVENT_EVENTS));
49 }
50
handleHalError(int32_t errorCode,int32_t property,int32_t operation)51 void VehicleNetworkEventMessageHandler::handleHalError(int32_t errorCode, int32_t property,
52 int32_t operation) {
53 Mutex::Autolock autoLock(mLock);
54 VehicleHalError* error = new VehicleHalError(errorCode, property, operation);
55 if (error == NULL) {
56 ALOGE("VehicleNetworkEventMessageHandler::handleHalError, new failed");
57 return;
58 }
59 mHalErrors.push_back(error);
60 mLooper->sendMessage(this, Message(EVENT_HAL_ERROR));
61 }
62
handleHalRestart(bool inMocking)63 void VehicleNetworkEventMessageHandler::handleHalRestart(bool inMocking) {
64 Mutex::Autolock autoLock(mLock);
65 mHalRestartEvents.push_back(inMocking);
66 mLooper->sendMessage(this, Message(EVENT_HAL_RESTART));
67 }
68
doHandleHalEvents()69 void VehicleNetworkEventMessageHandler::doHandleHalEvents() {
70 sp<VehiclePropValueListHolder> values;
71 do {
72 Mutex::Autolock autoLock(mLock);
73 if (mEvents.size() > 0) {
74 auto itr = mEvents.begin();
75 values = *itr;
76 mEvents.erase(itr);
77 }
78 } while (false);
79 if (values.get() != NULL) {
80 mListener->onEvents(values);
81 }
82 }
83
doHandleHalError()84 void VehicleNetworkEventMessageHandler::doHandleHalError() {
85 VehicleHalError* error = NULL;
86 do {
87 Mutex::Autolock autoLock(mLock);
88 if (mHalErrors.size() > 0) {
89 auto itr = mHalErrors.begin();
90 error = *itr;
91 mHalErrors.erase(itr);
92 }
93 } while (false);
94 if (error != NULL) {
95 mListener->onHalError(error->errorCode, error->property, error->operation);
96 delete error;
97 }
98 }
99
doHandleHalRestart()100 void VehicleNetworkEventMessageHandler::doHandleHalRestart() {
101 bool shouldDispatch = false;
102 bool inMocking = false;
103 do {
104 Mutex::Autolock autoLock(mLock);
105 if (mHalRestartEvents.size() > 0) {
106 auto itr = mHalRestartEvents.begin();
107 inMocking = *itr;
108 mHalRestartEvents.erase(itr);
109 shouldDispatch = true;
110 }
111 } while (false);
112 if (shouldDispatch) {
113 mListener->onHalRestart(inMocking);
114 }
115 }
116
handleMessage(const Message & message)117 void VehicleNetworkEventMessageHandler::handleMessage(const Message& message) {
118 switch (message.what) {
119 case EVENT_EVENTS:
120 doHandleHalEvents();
121 break;
122 case EVENT_HAL_ERROR:
123 doHandleHalError();
124 break;
125 case EVENT_HAL_RESTART:
126 doHandleHalRestart();
127 break;
128 }
129 }
130
131 // ----------------------------------------------------------------------------
132
createVehicleNetwork(sp<VehicleNetworkListener> & listener)133 sp<VehicleNetwork> VehicleNetwork::createVehicleNetwork(sp<VehicleNetworkListener>& listener) {
134 sp<IBinder> binder = defaultServiceManager()->getService(
135 String16(IVehicleNetwork::SERVICE_NAME));
136 sp<VehicleNetwork> vn;
137 if (binder != NULL) {
138 sp<IVehicleNetwork> ivn(interface_cast<IVehicleNetwork>(binder));
139 vn = new VehicleNetwork(ivn, listener);
140 if (vn != NULL) {
141 // in case thread pool is not started, start it.
142 ProcessState::self()->startThreadPool();
143 }
144 }
145 return vn;
146 }
147
VehicleNetwork(sp<IVehicleNetwork> & vehicleNetwork,sp<VehicleNetworkListener> & listener)148 VehicleNetwork::VehicleNetwork(sp<IVehicleNetwork>& vehicleNetwork,
149 sp<VehicleNetworkListener> &listener) :
150 mService(vehicleNetwork),
151 mClientListener(listener) {
152 }
153
~VehicleNetwork()154 VehicleNetwork::~VehicleNetwork() {
155 sp<IVehicleNetwork> service = getService();
156 IInterface::asBinder(service)->unlinkToDeath(this);
157 service->stopHalRestartMonitoring(this);
158 mHandlerThread->quit();
159 }
160
onFirstRef()161 void VehicleNetwork::onFirstRef() {
162 Mutex::Autolock autoLock(mLock);
163 mHandlerThread = new HandlerThread();
164 status_t r = mHandlerThread->start("VNS.NATIVE_LOOP");
165 if (r != NO_ERROR) {
166 ALOGE("cannot start handler thread, error:%d", r);
167 return;
168 }
169 sp<VehicleNetworkEventMessageHandler> handler(
170 new VehicleNetworkEventMessageHandler(mHandlerThread->getLooper(), mClientListener));
171 ASSERT_ALWAYS_ON_NO_MEMORY(handler.get());
172 mEventHandler = handler;
173 IInterface::asBinder(mService)->linkToDeath(this);
174 mService->startHalRestartMonitoring(this);
175 }
176
setInt32Property(int32_t property,int32_t value)177 status_t VehicleNetwork::setInt32Property(int32_t property, int32_t value) {
178 vehicle_prop_value_t v;
179 v.prop = property;
180 v.value_type = VEHICLE_VALUE_TYPE_INT32;
181 v.value.int32_value = value;
182 return setProperty(v);
183 }
184
getInt32Property(int32_t property,int32_t * value,int64_t * timestamp)185 status_t VehicleNetwork::getInt32Property(int32_t property, int32_t* value, int64_t* timestamp) {
186 vehicle_prop_value_t v;
187 v.prop = property;
188 // do not check error as it is always safe to access members for this data type.
189 // saves one if for normal flow.
190 status_t r = getProperty(&v);
191 *value = v.value.int32_value;
192 *timestamp = v.timestamp;
193 return r;
194 }
195
setInt64Property(int32_t property,int64_t value)196 status_t VehicleNetwork::setInt64Property(int32_t property, int64_t value) {
197 vehicle_prop_value_t v;
198 v.prop = property;
199 v.value_type = VEHICLE_VALUE_TYPE_INT64;
200 v.value.int64_value = value;
201 return setProperty(v);
202 }
203
getInt64Property(int32_t property,int64_t * value,int64_t * timestamp)204 status_t VehicleNetwork::getInt64Property(int32_t property, int64_t* value, int64_t* timestamp) {
205 vehicle_prop_value_t v;
206 v.prop = property;
207 status_t r = getProperty(&v);
208 *value = v.value.int64_value;
209 *timestamp = v.timestamp;
210 return r;
211 }
212
setFloatProperty(int32_t property,float value)213 status_t VehicleNetwork::setFloatProperty(int32_t property, float value) {
214 vehicle_prop_value_t v;
215 v.prop = property;
216 v.value_type = VEHICLE_VALUE_TYPE_FLOAT;
217 v.value.float_value = value;
218 return setProperty(v);
219 }
220
getFloatProperty(int32_t property,float * value,int64_t * timestamp)221 status_t VehicleNetwork::getFloatProperty(int32_t property, float* value, int64_t* timestamp) {
222 vehicle_prop_value_t v;
223 v.prop = property;
224 status_t r = getProperty(&v);
225 *value = v.value.float_value;
226 *timestamp = v.timestamp;
227 return r;
228 }
229
setStringProperty(int32_t property,const String8 & value)230 status_t VehicleNetwork::setStringProperty(int32_t property, const String8& value) {
231 vehicle_prop_value_t v;
232 v.prop = property;
233 v.value_type = VEHICLE_VALUE_TYPE_STRING;
234 v.value.str_value.data = (uint8_t*)value.string();
235 v.value.str_value.len = value.length();
236 return setProperty(v);
237 }
238
getStringProperty(int32_t property,String8 & value,int64_t * timestamp)239 status_t VehicleNetwork::getStringProperty(int32_t property, String8& value, int64_t* timestamp) {
240 vehicle_prop_value_t v;
241 v.prop = property;
242 v.value.str_value.len = 0;
243 status_t r = getProperty(&v);
244 if (r == NO_ERROR) {
245 value.setTo((char*)v.value.str_value.data, v.value.str_value.len);
246 }
247 *timestamp = v.timestamp;
248 return r;
249 }
250
listProperties(int32_t property)251 sp<VehiclePropertiesHolder> VehicleNetwork::listProperties(int32_t property) {
252 return getService()->listProperties(property);
253 }
254
setProperty(const vehicle_prop_value_t & value)255 status_t VehicleNetwork::setProperty(const vehicle_prop_value_t& value) {
256 return getService()->setProperty(value);
257 }
258
getProperty(vehicle_prop_value_t * value)259 status_t VehicleNetwork::getProperty(vehicle_prop_value_t* value) {
260 return getService()->getProperty(value);
261 }
262
subscribe(int32_t property,float sampleRate,int32_t zones)263 status_t VehicleNetwork::subscribe(int32_t property, float sampleRate, int32_t zones) {
264 return getService()->subscribe(this, property, sampleRate, zones);
265 }
266
unsubscribe(int32_t property)267 void VehicleNetwork::unsubscribe(int32_t property) {
268 getService()->unsubscribe(this, property);
269 }
270
injectEvent(const vehicle_prop_value_t & value)271 status_t VehicleNetwork::injectEvent(const vehicle_prop_value_t& value) {
272 return getService()->injectEvent(value);
273 }
274
startMocking(const sp<IVehicleNetworkHalMock> & mock)275 status_t VehicleNetwork::startMocking(const sp<IVehicleNetworkHalMock>& mock) {
276 return getService()->startMocking(mock);
277 }
278
stopMocking(const sp<IVehicleNetworkHalMock> & mock)279 void VehicleNetwork::stopMocking(const sp<IVehicleNetworkHalMock>& mock) {
280 getService()->stopMocking(mock);
281 }
282
startErrorListening()283 status_t VehicleNetwork::startErrorListening() {
284 return getService()->startErrorListening(this);
285 }
286
stopErrorListening()287 void VehicleNetwork::stopErrorListening() {
288 getService()->stopErrorListening(this);
289 }
290
binderDied(const wp<IBinder> & who)291 void VehicleNetwork::binderDied(const wp<IBinder>& who) {
292 ALOGE("service died");
293 do {
294 Mutex::Autolock autoLock(mLock);
295 sp<IBinder> ibinder = who.promote();
296 ibinder->unlinkToDeath(this);
297 sp<IBinder> binder = defaultServiceManager()->getService(
298 String16(IVehicleNetwork::SERVICE_NAME));
299 mService = interface_cast<IVehicleNetwork>(binder);
300 IInterface::asBinder(mService)->linkToDeath(this);
301 mService->startHalRestartMonitoring(this);
302 } while (false);
303 onHalRestart(false);
304 }
305
getService()306 sp<IVehicleNetwork> VehicleNetwork::getService() {
307 Mutex::Autolock autoLock(mLock);
308 return mService;
309 }
310
getEventHandler()311 sp<VehicleNetworkEventMessageHandler> VehicleNetwork::getEventHandler() {
312 Mutex::Autolock autoLock(mLock);
313 return mEventHandler;
314 }
315
onEvents(sp<VehiclePropValueListHolder> & events)316 void VehicleNetwork::onEvents(sp<VehiclePropValueListHolder>& events) {
317 getEventHandler()->handleHalEvents(events);
318 }
319
onHalError(int32_t errorCode,int32_t property,int32_t operation)320 void VehicleNetwork::onHalError(int32_t errorCode, int32_t property, int32_t operation) {
321 getEventHandler()->handleHalError(errorCode, property, operation);
322 }
323
onHalRestart(bool inMocking)324 void VehicleNetwork::onHalRestart(bool inMocking) {
325 getEventHandler()->handleHalRestart(inMocking);
326 }
327 }; // namespace android
328