1cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung/*
2cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * Copyright (C) 2015 The Android Open Source Project
3cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung *
4cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * Licensed under the Apache License, Version 2.0 (the "License");
5cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * you may not use this file except in compliance with the License.
6cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * You may obtain a copy of the License at
7cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung *
8cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung *      http://www.apache.org/licenses/LICENSE-2.0
9cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung *
10cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * Unless required by applicable law or agreed to in writing, software
11cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * distributed under the License is distributed on an "AS IS" BASIS,
12cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * See the License for the specific language governing permissions and
14cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * limitations under the License.
15cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung */
16cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
17cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoungpackage com.android.car.hal;
18cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
190d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev
200d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsevimport android.annotation.Nullable;
21cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.VehiclePropConfig;
22cfe93105f637c2822da113308f113ed418d0b319Pavel Maltsevimport android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
23fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung
24cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoungimport java.io.PrintWriter;
250d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsevimport java.util.Collection;
26fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoungimport java.util.LinkedList;
27cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoungimport java.util.List;
28cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
29cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung/**
30cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * Common interface for all HAL service like sensor HAL.
31cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * Each HAL service is connected with XyzService supporting XyzManager,
32cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung * and will translate HAL data into car api specific format.
33cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung */
34cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoungpublic abstract class HalServiceBase {
35fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung    /** For dispatching events. Kept here to avoid alloc every time */
36fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung    private final LinkedList<VehiclePropValue> mDispatchList = new LinkedList<VehiclePropValue>();
37fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung
381e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    final static int NOT_SUPPORTED_PROPERTY = -1;
391e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev
40fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung    public List<VehiclePropValue> getDispatchList() {
41fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung        return mDispatchList;
42fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung    }
43fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung
44cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    /** initialize */
45cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    public abstract void init();
46cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
47cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    /** release and stop operation */
48cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    public abstract void release();
49cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
50cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    /**
51cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     * return supported properties among all properties.
52cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     * @return null if no properties are supported
53cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     */
54cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    /**
55cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     * Take supported properties from given allProperties and return List of supported properties.
56cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     * @param allProperties
57cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     * @return null if no properties are supported.
58cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     */
590d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev    @Nullable
600d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev    public Collection<VehiclePropConfig> takeSupportedProperties(
610d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev            Collection<VehiclePropConfig> allProperties) {
620d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev        return null;
630d07c76bbc788fba8c77d8e932330ab22ec6ba27Pavel Maltsev    }
64cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
65fe30ba00aec2fd5936b17439f392a053ec54ec9akeunyoung    public abstract void handleHalEvents(List<VehiclePropValue> values);
66cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung
672a8c56d61fda68c06513ed0cdcbb64fff7e02304Pavel Maltsev    public void handlePropertySetError(int property, int area) {}
682a8c56d61fda68c06513ed0cdcbb64fff7e02304Pavel Maltsev
69cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    public abstract void dump(PrintWriter writer);
701e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev
711e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    /**
721e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev     * Helper class that maintains bi-directional mapping between manager's property
731e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev     * Id (public or system API) and vehicle HAL property Id.
741e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev     *
751e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev     * <p>This class is supposed to be immutable. Use {@link #create(int[])} factory method to
761e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev     * instantiate this class.
771e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev     */
781e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    static class ManagerToHalPropIdMap {
791e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        private final BidirectionalSparseIntArray mMap;
801e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev
811e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        /**
821e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev         * Creates {@link ManagerToHalPropIdMap} for provided [manager prop Id, hal prop Id] pairs.
831e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev         *
841e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev         * <p> The input array should have an odd number of elements.
851e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev         */
861e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        static ManagerToHalPropIdMap create(int... mgrToHalPropIds) {
871e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev            return new ManagerToHalPropIdMap(BidirectionalSparseIntArray.create(mgrToHalPropIds));
881e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        }
891e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev
901e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        private ManagerToHalPropIdMap(BidirectionalSparseIntArray map) {
911e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev            mMap = map;
921e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        }
931e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev
941e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        int getHalPropId(int managerPropId) {
951e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev            return mMap.getValue(managerPropId, NOT_SUPPORTED_PROPERTY);
961e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        }
971e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev
981e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        int getManagerPropId(int halPropId) {
991e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev            return mMap.getKey(halPropId, NOT_SUPPORTED_PROPERTY);
1001e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev        }
1011e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    }
102cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung}
103