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