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 package com.android.car.hal;
17 
18 import android.car.CarInfoManager;
19 import android.util.Log;
20 
21 import com.android.car.CarLog;
22 import com.android.car.vehiclenetwork.VehicleNetworkConsts;
23 import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
24 import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
25 
26 import java.io.PrintWriter;
27 import java.util.HashMap;
28 import java.util.LinkedList;
29 import java.util.List;
30 
31 public class InfoHalService extends HalServiceBase {
32 
33     private final VehicleHal mHal;
34     private final HashMap<String, VehiclePropConfig> mInfoNameToHalPropertyMap =
35             new HashMap<String, VehiclePropConfig>();
36 
InfoHalService(VehicleHal hal)37     public InfoHalService(VehicleHal hal) {
38         mHal = hal;
39     }
40 
41     @Override
init()42     public void init() {
43         //nothing to do
44     }
45 
46     @Override
release()47     public synchronized void release() {
48         mInfoNameToHalPropertyMap.clear();
49     }
50 
51     @Override
takeSupportedProperties( List<VehiclePropConfig> allProperties)52     public synchronized List<VehiclePropConfig> takeSupportedProperties(
53             List<VehiclePropConfig> allProperties) {
54         List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
55         for (VehiclePropConfig p: allProperties) {
56             String infoName = getInfoStringFromProperty(p.getProp());
57             if (infoName != null) {
58                 supported.add(p);
59                 mInfoNameToHalPropertyMap.put(infoName, p);
60             }
61         }
62         return supported;
63     }
64 
65     @Override
handleHalEvents(List<VehiclePropValue> values)66     public void handleHalEvents(List<VehiclePropValue> values) {
67         for (VehiclePropValue v : values) {
68             logUnexpectedEvent(v.getProp());
69         }
70     }
71 
72     @Override
dump(PrintWriter writer)73     public void dump(PrintWriter writer) {
74         writer.println("*InfoHal*");
75         writer.println("**Supported properties**");
76         for (VehiclePropConfig p : mInfoNameToHalPropertyMap.values()) {
77             //TODO fix toString
78             writer.println(p.toString());
79         }
80     }
81 
getInt(String key)82     public int[] getInt(String key) {
83         VehiclePropConfig prop = getHalPropertyFromInfoString(key);
84         if (prop == null) {
85             return null;
86         }
87         // no lock here as get can take time and multiple get should be possible.
88         int v = mHal.getVehicleNetwork().getIntProperty(prop.getProp());
89         return new int[] { v };
90     }
91 
getLong(String key)92     public long[] getLong(String key) {
93         VehiclePropConfig prop = getHalPropertyFromInfoString(key);
94         if (prop == null) {
95             return null;
96         }
97         // no lock here as get can take time and multiple get should be possible.
98         long v = mHal.getVehicleNetwork().getLongProperty(prop.getProp());
99         return new long[] { v };
100     }
101 
getFloat(String key)102     public float[] getFloat(String key) {
103         VehiclePropConfig prop = getHalPropertyFromInfoString(key);
104         if (prop == null) {
105             return null;
106         }
107         // no lock here as get can take time and multiple get should be possible.
108         float v = mHal.getVehicleNetwork().getFloatProperty(prop.getProp());
109         return new float[] { v };
110     }
111 
getString(String key)112     public String getString(String key) {
113         VehiclePropConfig prop = getHalPropertyFromInfoString(key);
114         if (prop == null) {
115             return null;
116         }
117         // no lock here as get can take time and multiple get should be possible.
118         return mHal.getVehicleNetwork().getStringProperty(prop.getProp());
119     }
120 
getHalPropertyFromInfoString(String key)121     private synchronized VehiclePropConfig getHalPropertyFromInfoString(String key) {
122         return mInfoNameToHalPropertyMap.get(key);
123     }
124 
logUnexpectedEvent(int property)125     private void logUnexpectedEvent(int property) {
126        Log.w(CarLog.TAG_INFO, "unexpected HAL event for property 0x" +
127                Integer.toHexString(property));
128     }
129 
getInfoStringFromProperty(int property)130     private static String getInfoStringFromProperty(int property) {
131         switch (property) {
132             case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MAKE:
133                 return CarInfoManager.KEY_MANUFACTURER;
134             case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL:
135                 return CarInfoManager.KEY_MODEL;
136             case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL_YEAR:
137                 return CarInfoManager.KEY_MODEL_YEAR;
138             case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_VIN:
139                 return CarInfoManager.KEY_VEHICLE_ID;
140             //TODO add more properties
141             default:
142                 return null;
143         }
144     }
145 }
146