Utils.java revision 15c4ec4a4735440f36847dd24e0d602b66edfd94
113bab2f09e9189c2b1e83ae37a1134108f9479clandley/* 213bab2f09e9189c2b1e83ae37a1134108f9479clandley * Copyright (C) 2017 The Android Open Source Project 313bab2f09e9189c2b1e83ae37a1134108f9479clandley * 413bab2f09e9189c2b1e83ae37a1134108f9479clandley * Licensed under the Apache License, Version 2.0 (the "License"); 513bab2f09e9189c2b1e83ae37a1134108f9479clandley * you may not use this file except in compliance with the License. 6c56215062c961402515daeef8330ed75cd94af29landley * You may obtain a copy of the License at 7c56215062c961402515daeef8330ed75cd94af29landley * 890afbad4c1f115d5363fe99eb797d2458cd298a0Rob Landley * http://www.apache.org/licenses/LICENSE-2.0 98387fcb03edc718f031bc5b6af056c2ef408f3d5Paul Barker * 1090afbad4c1f115d5363fe99eb797d2458cd298a0Rob Landley * Unless required by applicable law or agreed to in writing, software 11ad602aa127e44eade76fbb05fd27ee8f5825282aRob Landley * distributed under the License is distributed on an "AS IS" BASIS, 12f2311a42a0751e7c039981857fcf60b40f36b475Rob Landley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c56215062c961402515daeef8330ed75cd94af29landley * See the License for the specific language governing permissions and 14a6d696b74adb08d83b21f8299b5443f31a5f43ecRob Landley * limitations under the License. 15a6d696b74adb08d83b21f8299b5443f31a5f43ecRob Landley */ 16ec0b482e9fd27cb994b30e0f1b8a4d39a85735ccRob Landley 17f3e56f4e4ff773de95fa2c9daf979734d826fc33Rob Landleypackage com.android.car.vehiclehal.test; 18f3e56f4e4ff773de95fa2c9daf979734d826fc33Rob Landley 19a6d696b74adb08d83b21f8299b5443f31a5f43ecRob Landleyimport static android.os.SystemClock.elapsedRealtime; 20c56215062c961402515daeef8330ed75cd94af29landley 2155928b1e0a08d84a5cbc50020f0a8c1024f5b6ceRob Landleyimport android.annotation.Nullable; 22c56215062c961402515daeef8330ed75cd94af29landleyimport android.hardware.automotive.vehicle.V2_0.IVehicle; 23c56215062c961402515daeef8330ed75cd94af29landleyimport android.hardware.automotive.vehicle.V2_0.VehiclePropConfig; 24933919cd8094e870b3e7a554605fd49b20ddb1e0Rob Landleyimport android.hardware.automotive.vehicle.V2_0.VehiclePropValue; 25c56215062c961402515daeef8330ed75cd94af29landleyimport android.os.RemoteException; 26c56215062c961402515daeef8330ed75cd94af29landleyimport android.util.Log; 27b1aaba1fc8176ac0b7c202a664d2554aa0967116Rob Landleyimport com.android.car.vehiclehal.VehiclePropValueBuilder; 288fdcfdb4479dff7a993a25a63253f0e749fd99feRob Landleyimport java.util.Objects; 29c56215062c961402515daeef8330ed75cd94af29landley 304f344e356d2c36c4b1df46917eaef25f82ca79a9landleyfinal class Utils { 3113bab2f09e9189c2b1e83ae37a1134108f9479clandley private Utils() {} 327aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley 3313bab2f09e9189c2b1e83ae37a1134108f9479clandley private static final String TAG = Utils.class.getSimpleName(); 34dc1af185e73410c5cad997c600678c212262a13cRob Landley 35dc1af185e73410c5cad997c600678c212262a13cRob Landley @Nullable 367aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley static <T> T tryWithDeadline(long waitMilliseconds, java.util.function.Supplier<T> f) { 377aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley f = Objects.requireNonNull(f); 3813bab2f09e9189c2b1e83ae37a1134108f9479clandley T object = f.get(); 397aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley long start = elapsedRealtime(); 407aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley while (object == null && (start + waitMilliseconds) > elapsedRealtime()) { 4113bab2f09e9189c2b1e83ae37a1134108f9479clandley try { 42933919cd8094e870b3e7a554605fd49b20ddb1e0Rob Landley Thread.sleep(100); 4313bab2f09e9189c2b1e83ae37a1134108f9479clandley } catch (InterruptedException e) { 447aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley throw new RuntimeException("Sleep was interrupted", e); 457aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 467aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley 472c226859cfc911c4a1eea009897050a16714aeecRob Landley object = f.get(); 487aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 497aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley return object; 507aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley } 517aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley 527aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley static String dumpVehiclePropValue(VehiclePropValue vpv) { 537aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley vpv = Objects.requireNonNull(vpv); 547aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley return "prop = " 5513bab2f09e9189c2b1e83ae37a1134108f9479clandley + vpv.prop 5613bab2f09e9189c2b1e83ae37a1134108f9479clandley + '\n' 57fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + "areaId = " 58fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + vpv.areaId 598f8c504e585b6850abf628cabdb9ef231bef1a35Rob Landley + '\n' 608f8c504e585b6850abf628cabdb9ef231bef1a35Rob Landley + "timestamp = " 61fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + vpv.timestamp 62fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + '\n' 63fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + "int32Values = " 64fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + vpv.value.int32Values 65f3e56f4e4ff773de95fa2c9daf979734d826fc33Rob Landley + '\n' 664307a7b07cec4ad8cbab47a29ba941f8cb041812Rob Landley + "floatValues = " 6755928b1e0a08d84a5cbc50020f0a8c1024f5b6ceRob Landley + vpv.value.floatValues 68fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + '\n' 69fc2224b26c73198d00eba714caf47bd2e3a5e63bRob Landley + "int64Values =" 7029e75d51d447c5c0aae9834f5988b79a945c7accRob Landley + vpv.value.int64Values 7129e75d51d447c5c0aae9834f5988b79a945c7accRob Landley + '\n' 7229e75d51d447c5c0aae9834f5988b79a945c7accRob Landley + "bytes = " 7329e75d51d447c5c0aae9834f5988b79a945c7accRob Landley + vpv.value.bytes 7429e75d51d447c5c0aae9834f5988b79a945c7accRob Landley + '\n' 7529e75d51d447c5c0aae9834f5988b79a945c7accRob Landley + "string = " 763b51a07e478d64a84e40b3a7c026b2f8566b194bRob Landley + vpv.value.stringValue 77bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley + '\n'; 78bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley } 79bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley 80bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley static boolean isVhalPropertyAvailable(IVehicle vehicle, int prop) throws RemoteException { 81bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley return vehicle.getAllPropConfigs() 829b14cb6b12e6f1b07a1ad401e5cb6e091df4ac2fRob Landley .stream() 83fc49761a9c992a120a27cca016d6a3ed31b1f3d3Rob Landley .anyMatch((VehiclePropConfig config) -> config.prop == prop); 8429e75d51d447c5c0aae9834f5988b79a945c7accRob Landley } 8529e75d51d447c5c0aae9834f5988b79a945c7accRob Landley 8629e75d51d447c5c0aae9834f5988b79a945c7accRob Landley static VehiclePropValue readVhalProperty( 8729e75d51d447c5c0aae9834f5988b79a945c7accRob Landley IVehicle vehicle, 8829e75d51d447c5c0aae9834f5988b79a945c7accRob Landley VehiclePropValue request, 8929e75d51d447c5c0aae9834f5988b79a945c7accRob Landley java.util.function.BiFunction<Integer, VehiclePropValue, Boolean> f) { 9029e75d51d447c5c0aae9834f5988b79a945c7accRob Landley vehicle = Objects.requireNonNull(vehicle); 9129e75d51d447c5c0aae9834f5988b79a945c7accRob Landley request = Objects.requireNonNull(request); 9229e75d51d447c5c0aae9834f5988b79a945c7accRob Landley VehiclePropValue vpv[] = new VehiclePropValue[] {null}; 9329e75d51d447c5c0aae9834f5988b79a945c7accRob Landley try { 9429e75d51d447c5c0aae9834f5988b79a945c7accRob Landley vehicle.get( 9529e75d51d447c5c0aae9834f5988b79a945c7accRob Landley request, 9629e75d51d447c5c0aae9834f5988b79a945c7accRob Landley (int status, VehiclePropValue propValue) -> { 97bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley if (f.apply(status, propValue)) { 98bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley vpv[0] = propValue; 99bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley } 100bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley }); 101bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley } catch (RemoteException e) { 1023b51a07e478d64a84e40b3a7c026b2f8566b194bRob Landley Log.w(TAG, "attempt to read VHAL property " + 103bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley dumpVehiclePropValue(request) + " caused RemoteException: ", e); 104bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley } 105bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley return vpv[0]; 1061bc522424f6bb21842366ccd11953136436b684bRob Landley } 10790b200cac621ee925476297a2b70ddf3101cbb45Rob Landley 108bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley static VehiclePropValue readVhalProperty( 109bb504f382dc6c596e6b2b9ce04931e7fbdd15bbeRob Landley IVehicle vehicle, 1103b51a07e478d64a84e40b3a7c026b2f8566b194bRob Landley int propertyId, 111cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley java.util.function.BiFunction<Integer, VehiclePropValue, Boolean> f) { 112cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley return readVhalProperty(vehicle, propertyId, 0, f); 113ca311f1a41a579a57076adfeb2cc08b20dbca21aRob Landley } 114ca311f1a41a579a57076adfeb2cc08b20dbca21aRob Landley 1157aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley static VehiclePropValue readVhalProperty( 116e0377fb294821a68112d4da09f836ac42e3d5956Rob Landley IVehicle vehicle, 1177aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley int propertyId, 118ca311f1a41a579a57076adfeb2cc08b20dbca21aRob Landley int areaId, 119ca311f1a41a579a57076adfeb2cc08b20dbca21aRob Landley java.util.function.BiFunction<Integer, VehiclePropValue, Boolean> f) { 1207aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley VehiclePropValue request = 121e0377fb294821a68112d4da09f836ac42e3d5956Rob Landley VehiclePropValueBuilder.newBuilder(propertyId).setAreaId(areaId).build(); 1227aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley return readVhalProperty(vehicle, request, f); 1235c87c1426b5c99dd1f2a3ac7493996c342efef4eRob Landley } 12462b53ed9e64e40d2534f1239c4b314d84e79f15fPatrick Ohly} 125ca311f1a41a579a57076adfeb2cc08b20dbca21aRob Landley