1 /* 2 * Copyright (C) 2018 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 17 package com.android.car.hal; 18 19 import static java.lang.Integer.toHexString; 20 21 import android.annotation.NonNull; 22 import android.annotation.Nullable; 23 import android.car.Car; 24 import android.car.VehicleHvacFanDirection; 25 import android.car.builtin.util.Slogf; 26 import android.car.hardware.property.VehicleVendorPermission; 27 import android.hardware.automotive.vehicle.ElectronicTollCollectionCardStatus; 28 import android.hardware.automotive.vehicle.ElectronicTollCollectionCardType; 29 import android.hardware.automotive.vehicle.EvChargeState; 30 import android.hardware.automotive.vehicle.EvConnectorType; 31 import android.hardware.automotive.vehicle.EvRegenerativeBrakingState; 32 import android.hardware.automotive.vehicle.FuelType; 33 import android.hardware.automotive.vehicle.PortLocationType; 34 import android.hardware.automotive.vehicle.TrailerState; 35 import android.hardware.automotive.vehicle.VehicleAreaSeat; 36 import android.hardware.automotive.vehicle.VehicleGear; 37 import android.hardware.automotive.vehicle.VehicleIgnitionState; 38 import android.hardware.automotive.vehicle.VehicleLightState; 39 import android.hardware.automotive.vehicle.VehicleLightSwitch; 40 import android.hardware.automotive.vehicle.VehicleOilLevel; 41 import android.hardware.automotive.vehicle.VehicleProperty; 42 import android.hardware.automotive.vehicle.VehiclePropertyGroup; 43 import android.hardware.automotive.vehicle.VehiclePropertyType; 44 import android.hardware.automotive.vehicle.VehicleSeatOccupancyState; 45 import android.hardware.automotive.vehicle.VehicleTurnSignal; 46 import android.hardware.automotive.vehicle.VehicleUnit; 47 import android.util.Pair; 48 import android.util.SparseArray; 49 50 import com.android.car.CarLog; 51 52 import java.lang.reflect.Field; 53 import java.util.ArrayList; 54 import java.util.HashMap; 55 import java.util.HashSet; 56 import java.util.List; 57 import java.util.Set; 58 59 /** 60 * Helper class to define which property IDs are used by PropertyHalService. This class binds the 61 * read and write permissions to the property ID. 62 */ 63 public class PropertyHalServiceIds { 64 65 /** 66 * Index key is propertyId, and the value is readPermission, writePermission. 67 * If the property can not be written (or read), set value as NULL. 68 * Throw an IllegalArgumentException when try to write READ_ONLY properties or read WRITE_ONLY 69 * properties. 70 */ 71 private final SparseArray<Pair<String, String>> mProps; 72 private final HashSet<Integer> mPropForUnits; 73 // Key: propId, Value: possible value for the property 74 private final HashMap<Integer, Set<Integer>> mPropToValidValue; 75 private final HashMap<Integer, Integer> mPropToValidBitFlag; 76 private static final String TAG = CarLog.tagFor(PropertyHalServiceIds.class); 77 // Enums are used as return value in Vehicle HAL. 78 private static final Set<Integer> FUEL_TYPE = 79 new HashSet<>(getIntegersFromDataEnums(FuelType.class)); 80 private static final Set<Integer> EV_CONNECTOR_TYPE = 81 new HashSet<>(getIntegersFromDataEnums(EvConnectorType.class)); 82 private static final Set<Integer> PORT_LOCATION = 83 new HashSet<>(getIntegersFromDataEnums(PortLocationType.class)); 84 private static final Set<Integer> VEHICLE_SEAT = 85 new HashSet<>(getIntegersFromDataEnums(VehicleAreaSeat.class)); 86 private static final Set<Integer> OIL_LEVEL = 87 new HashSet<>(getIntegersFromDataEnums(VehicleOilLevel.class)); 88 private static final Set<Integer> VEHICLE_GEAR = 89 new HashSet<>(getIntegersFromDataEnums(VehicleGear.class)); 90 private static final Set<Integer> TURN_SIGNAL = 91 new HashSet<>(getIntegersFromDataEnums(VehicleTurnSignal.class)); 92 private static final Set<Integer> IGNITION_STATE = 93 new HashSet<>(getIntegersFromDataEnums(VehicleIgnitionState.class)); 94 private static final Set<Integer> VEHICLE_UNITS = 95 new HashSet<>(getIntegersFromDataEnums(VehicleUnit.class)); 96 private static final Set<Integer> SEAT_OCCUPANCY_STATE = 97 new HashSet<>(getIntegersFromDataEnums(VehicleSeatOccupancyState.class)); 98 private static final Set<Integer> VEHICLE_LIGHT_STATE = 99 new HashSet<>(getIntegersFromDataEnums(VehicleLightState.class)); 100 private static final Set<Integer> VEHICLE_LIGHT_SWITCH = 101 new HashSet<>(getIntegersFromDataEnums(VehicleLightSwitch.class)); 102 private static final int HVAC_FAN_DIRECTION_COMBINATIONS = 103 generateAllCombination(VehicleHvacFanDirection.class); 104 private static final Set<Integer> ETC_CARD_TYPE = 105 new HashSet<>(getIntegersFromDataEnums(ElectronicTollCollectionCardType.class)); 106 private static final Set<Integer> ETC_CARD_STATUS = 107 new HashSet<>(getIntegersFromDataEnums(ElectronicTollCollectionCardStatus.class)); 108 private static final Set<Integer> EV_CHARGE_STATE = 109 new HashSet<>(getIntegersFromDataEnums(EvChargeState.class)); 110 private static final Set<Integer> EV_REGENERATIVE_BREAKING_STATE = 111 new HashSet<>(getIntegersFromDataEnums(EvRegenerativeBrakingState.class)); 112 private static final Set<Integer> TRAILER_PRESENT = 113 new HashSet<>(getIntegersFromDataEnums(TrailerState.class)); 114 115 // This is the property ID for GENERAL_SAFETY_REGULATION_COMPLIANCE added in 116 // API version 34. We cannot change API for this version now, so we have to hard code the 117 // property ID here. 118 // 119 // Client wishing to use this property must use property ID: 289410887 (0x11400F47) for 120 // {@link CarPropertyManager}. The property is defined as read-only static global system 121 // property with one int value from the following enums: 122 // <ul> 123 // <li> 0: GSR_COMPLIANCE_NOT_REQUIRED 124 // <li> 1: GSR_COMPLIANCE_REQUIRED_V1 125 private static final int PROP_GENERAL_SAFETY_REGULATION_COMPLIANCE = 0x11400F47; 126 127 // default vendor permission 128 private static final int PERMISSION_CAR_VENDOR_DEFAULT = 0x00000000; 129 130 // permissions for the property related with window 131 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW = 0X00000001; 132 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW = 0x00000002; 133 // permissions for the property related with door 134 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR = 0x00000003; 135 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR = 0x00000004; 136 // permissions for the property related with seat 137 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT = 0x00000005; 138 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT = 0x00000006; 139 // permissions for the property related with mirror 140 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR = 0x00000007; 141 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR = 0x00000008; 142 143 // permissions for the property related with car's information 144 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO = 0x00000009; 145 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO = 0x0000000A; 146 // permissions for the property related with car's engine 147 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE = 0x0000000B; 148 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE = 0x0000000C; 149 // permissions for the property related with car's HVAC 150 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC = 0x0000000D; 151 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC = 0x0000000E; 152 // permissions for the property related with car's light 153 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT = 0x0000000F; 154 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT = 0x00000010; 155 156 // permissions reserved for other vendor permission 157 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_1 = 0x00010000; 158 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_1 = 0x00011000; 159 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_2 = 0x00020000; 160 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_2 = 0x00021000; 161 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_3 = 0x00030000; 162 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_3 = 0x00031000; 163 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_4 = 0x00040000; 164 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_4 = 0x00041000; 165 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_5 = 0x00050000; 166 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_5 = 0x00051000; 167 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_6 = 0x00060000; 168 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_6 = 0x00061000; 169 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_7 = 0x00070000; 170 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_7 = 0x00071000; 171 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_8 = 0x00080000; 172 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_8 = 0x00081000; 173 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_9 = 0x00090000; 174 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_9 = 0x00091000; 175 private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_10 = 0x000A0000; 176 private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_10 = 0x000A1000; 177 // Not available for android 178 private static final int PERMISSION_CAR_VENDOR_NOT_ACCESSIBLE = 0xF0000000; 179 PropertyHalServiceIds()180 public PropertyHalServiceIds() { 181 mProps = new SparseArray<>(); 182 mPropForUnits = new HashSet<>(); 183 mPropToValidValue = new HashMap<>(); 184 mPropToValidBitFlag = new HashMap<>(); 185 // Add propertyId and read/write permissions 186 // Cabin Properties 187 mProps.put(VehicleProperty.DOOR_POS, new Pair<>( 188 Car.PERMISSION_CONTROL_CAR_DOORS, 189 Car.PERMISSION_CONTROL_CAR_DOORS)); 190 mProps.put(VehicleProperty.DOOR_MOVE, new Pair<>( 191 Car.PERMISSION_CONTROL_CAR_DOORS, 192 Car.PERMISSION_CONTROL_CAR_DOORS)); 193 mProps.put(VehicleProperty.DOOR_LOCK, new Pair<>( 194 Car.PERMISSION_CONTROL_CAR_DOORS, 195 Car.PERMISSION_CONTROL_CAR_DOORS)); 196 mProps.put(VehicleProperty.MIRROR_Z_POS, new Pair<>( 197 Car.PERMISSION_CONTROL_CAR_MIRRORS, 198 Car.PERMISSION_CONTROL_CAR_MIRRORS)); 199 mProps.put(VehicleProperty.MIRROR_Z_MOVE, new Pair<>( 200 Car.PERMISSION_CONTROL_CAR_MIRRORS, 201 Car.PERMISSION_CONTROL_CAR_MIRRORS)); 202 mProps.put(VehicleProperty.MIRROR_Y_POS, new Pair<>( 203 Car.PERMISSION_CONTROL_CAR_MIRRORS, 204 Car.PERMISSION_CONTROL_CAR_MIRRORS)); 205 mProps.put(VehicleProperty.MIRROR_Y_MOVE, new Pair<>( 206 Car.PERMISSION_CONTROL_CAR_MIRRORS, 207 Car.PERMISSION_CONTROL_CAR_MIRRORS)); 208 mProps.put(VehicleProperty.MIRROR_LOCK, new Pair<>( 209 Car.PERMISSION_CONTROL_CAR_MIRRORS, 210 Car.PERMISSION_CONTROL_CAR_MIRRORS)); 211 mProps.put(VehicleProperty.MIRROR_FOLD, new Pair<>( 212 Car.PERMISSION_CONTROL_CAR_MIRRORS, 213 Car.PERMISSION_CONTROL_CAR_MIRRORS)); 214 mProps.put(VehicleProperty.SEAT_MEMORY_SELECT, new Pair<>( 215 null, 216 Car.PERMISSION_CONTROL_CAR_SEATS)); 217 mProps.put(VehicleProperty.SEAT_MEMORY_SET, new Pair<>( 218 null, 219 Car.PERMISSION_CONTROL_CAR_SEATS)); 220 mProps.put(VehicleProperty.SEAT_BELT_BUCKLED, new Pair<>( 221 Car.PERMISSION_CONTROL_CAR_SEATS, 222 Car.PERMISSION_CONTROL_CAR_SEATS)); 223 mProps.put(VehicleProperty.SEAT_BELT_HEIGHT_POS, new Pair<>( 224 Car.PERMISSION_CONTROL_CAR_SEATS, 225 Car.PERMISSION_CONTROL_CAR_SEATS)); 226 mProps.put(VehicleProperty.SEAT_BELT_HEIGHT_MOVE, new Pair<>( 227 Car.PERMISSION_CONTROL_CAR_SEATS, 228 Car.PERMISSION_CONTROL_CAR_SEATS)); 229 mProps.put(VehicleProperty.SEAT_FORE_AFT_POS, new Pair<>( 230 Car.PERMISSION_CONTROL_CAR_SEATS, 231 Car.PERMISSION_CONTROL_CAR_SEATS)); 232 mProps.put(VehicleProperty.SEAT_FORE_AFT_MOVE, new Pair<>( 233 Car.PERMISSION_CONTROL_CAR_SEATS, 234 Car.PERMISSION_CONTROL_CAR_SEATS)); 235 mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_1_POS, new Pair<>( 236 Car.PERMISSION_CONTROL_CAR_SEATS, 237 Car.PERMISSION_CONTROL_CAR_SEATS)); 238 mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_1_MOVE, new Pair<>( 239 Car.PERMISSION_CONTROL_CAR_SEATS, 240 Car.PERMISSION_CONTROL_CAR_SEATS)); 241 mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_2_POS, new Pair<>( 242 Car.PERMISSION_CONTROL_CAR_SEATS, 243 Car.PERMISSION_CONTROL_CAR_SEATS)); 244 mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_2_MOVE, new Pair<>( 245 Car.PERMISSION_CONTROL_CAR_SEATS, 246 Car.PERMISSION_CONTROL_CAR_SEATS)); 247 mProps.put(VehicleProperty.SEAT_HEIGHT_POS, new Pair<>( 248 Car.PERMISSION_CONTROL_CAR_SEATS, 249 Car.PERMISSION_CONTROL_CAR_SEATS)); 250 mProps.put(VehicleProperty.SEAT_HEIGHT_MOVE, new Pair<>( 251 Car.PERMISSION_CONTROL_CAR_SEATS, 252 Car.PERMISSION_CONTROL_CAR_SEATS)); 253 mProps.put(VehicleProperty.SEAT_DEPTH_POS, new Pair<>( 254 Car.PERMISSION_CONTROL_CAR_SEATS, 255 Car.PERMISSION_CONTROL_CAR_SEATS)); 256 mProps.put(VehicleProperty.SEAT_DEPTH_MOVE, new Pair<>( 257 Car.PERMISSION_CONTROL_CAR_SEATS, 258 Car.PERMISSION_CONTROL_CAR_SEATS)); 259 mProps.put(VehicleProperty.SEAT_TILT_POS, new Pair<>( 260 Car.PERMISSION_CONTROL_CAR_SEATS, 261 Car.PERMISSION_CONTROL_CAR_SEATS)); 262 mProps.put(VehicleProperty.SEAT_TILT_MOVE, new Pair<>( 263 Car.PERMISSION_CONTROL_CAR_SEATS, 264 Car.PERMISSION_CONTROL_CAR_SEATS)); 265 mProps.put(VehicleProperty.SEAT_LUMBAR_FORE_AFT_POS, new Pair<>( 266 Car.PERMISSION_CONTROL_CAR_SEATS, 267 Car.PERMISSION_CONTROL_CAR_SEATS)); 268 mProps.put(VehicleProperty.SEAT_LUMBAR_FORE_AFT_MOVE, new Pair<>( 269 Car.PERMISSION_CONTROL_CAR_SEATS, 270 Car.PERMISSION_CONTROL_CAR_SEATS)); 271 mProps.put(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_POS, new Pair<>( 272 Car.PERMISSION_CONTROL_CAR_SEATS, 273 Car.PERMISSION_CONTROL_CAR_SEATS)); 274 mProps.put(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_MOVE, new Pair<>( 275 Car.PERMISSION_CONTROL_CAR_SEATS, 276 Car.PERMISSION_CONTROL_CAR_SEATS)); 277 mProps.put(VehicleProperty.SEAT_HEADREST_HEIGHT_POS, new Pair<>( 278 Car.PERMISSION_CONTROL_CAR_SEATS, 279 Car.PERMISSION_CONTROL_CAR_SEATS)); 280 mProps.put(VehicleProperty.SEAT_HEADREST_HEIGHT_MOVE, new Pair<>( 281 Car.PERMISSION_CONTROL_CAR_SEATS, 282 Car.PERMISSION_CONTROL_CAR_SEATS)); 283 mProps.put(VehicleProperty.SEAT_HEADREST_ANGLE_POS, new Pair<>( 284 Car.PERMISSION_CONTROL_CAR_SEATS, 285 Car.PERMISSION_CONTROL_CAR_SEATS)); 286 mProps.put(VehicleProperty.SEAT_HEADREST_ANGLE_MOVE, new Pair<>( 287 Car.PERMISSION_CONTROL_CAR_SEATS, 288 Car.PERMISSION_CONTROL_CAR_SEATS)); 289 mProps.put(VehicleProperty.SEAT_HEADREST_FORE_AFT_POS, new Pair<>( 290 Car.PERMISSION_CONTROL_CAR_SEATS, 291 Car.PERMISSION_CONTROL_CAR_SEATS)); 292 mProps.put(VehicleProperty.SEAT_HEADREST_FORE_AFT_MOVE, new Pair<>( 293 Car.PERMISSION_CONTROL_CAR_SEATS, 294 Car.PERMISSION_CONTROL_CAR_SEATS)); 295 mProps.put(VehicleProperty.SEAT_OCCUPANCY, new Pair<>( 296 Car.PERMISSION_CONTROL_CAR_SEATS, 297 null)); 298 mProps.put(VehicleProperty.WINDOW_POS, new Pair<>( 299 Car.PERMISSION_CONTROL_CAR_WINDOWS, 300 Car.PERMISSION_CONTROL_CAR_WINDOWS)); 301 mProps.put(VehicleProperty.WINDOW_MOVE, new Pair<>( 302 Car.PERMISSION_CONTROL_CAR_WINDOWS, 303 Car.PERMISSION_CONTROL_CAR_WINDOWS)); 304 mProps.put(VehicleProperty.WINDOW_LOCK, new Pair<>( 305 Car.PERMISSION_CONTROL_CAR_WINDOWS, 306 Car.PERMISSION_CONTROL_CAR_WINDOWS)); 307 308 // HVAC properties 309 mProps.put(VehicleProperty.HVAC_FAN_SPEED, new Pair<>( 310 Car.PERMISSION_CONTROL_CAR_CLIMATE, 311 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 312 mProps.put(VehicleProperty.HVAC_FAN_DIRECTION, new Pair<>( 313 Car.PERMISSION_CONTROL_CAR_CLIMATE, 314 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 315 mProps.put(VehicleProperty.HVAC_TEMPERATURE_CURRENT, new Pair<>( 316 Car.PERMISSION_CONTROL_CAR_CLIMATE, 317 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 318 mProps.put(VehicleProperty.HVAC_TEMPERATURE_SET, new Pair<>( 319 Car.PERMISSION_CONTROL_CAR_CLIMATE, 320 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 321 mProps.put(VehicleProperty.HVAC_TEMPERATURE_VALUE_SUGGESTION, new Pair<>( 322 Car.PERMISSION_CONTROL_CAR_CLIMATE, 323 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 324 mProps.put(VehicleProperty.HVAC_DEFROSTER, new Pair<>( 325 Car.PERMISSION_CONTROL_CAR_CLIMATE, 326 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 327 mProps.put(VehicleProperty.HVAC_ELECTRIC_DEFROSTER_ON, new Pair<>( 328 Car.PERMISSION_CONTROL_CAR_CLIMATE, 329 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 330 mProps.put(VehicleProperty.HVAC_AC_ON, new Pair<>( 331 Car.PERMISSION_CONTROL_CAR_CLIMATE, 332 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 333 mProps.put(VehicleProperty.HVAC_MAX_AC_ON, new Pair<>( 334 Car.PERMISSION_CONTROL_CAR_CLIMATE, 335 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 336 mProps.put(VehicleProperty.HVAC_MAX_DEFROST_ON, new Pair<>( 337 Car.PERMISSION_CONTROL_CAR_CLIMATE, 338 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 339 mProps.put(VehicleProperty.HVAC_RECIRC_ON, new Pair<>( 340 Car.PERMISSION_CONTROL_CAR_CLIMATE, 341 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 342 mProps.put(VehicleProperty.HVAC_DUAL_ON, new Pair<>( 343 Car.PERMISSION_CONTROL_CAR_CLIMATE, 344 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 345 mProps.put(VehicleProperty.HVAC_AUTO_ON, new Pair<>( 346 Car.PERMISSION_CONTROL_CAR_CLIMATE, 347 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 348 mProps.put(VehicleProperty.HVAC_SEAT_TEMPERATURE, new Pair<>( 349 Car.PERMISSION_CONTROL_CAR_CLIMATE, 350 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 351 mProps.put(VehicleProperty.HVAC_SIDE_MIRROR_HEAT, new Pair<>( 352 Car.PERMISSION_CONTROL_CAR_CLIMATE, 353 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 354 mProps.put(VehicleProperty.HVAC_STEERING_WHEEL_HEAT, new Pair<>( 355 Car.PERMISSION_CONTROL_CAR_CLIMATE, 356 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 357 mProps.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, new Pair<>( 358 Car.PERMISSION_CONTROL_CAR_CLIMATE, 359 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 360 mProps.put(VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM, new Pair<>( 361 Car.PERMISSION_CONTROL_CAR_CLIMATE, 362 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 363 mProps.put(VehicleProperty.HVAC_POWER_ON, new Pair<>( 364 Car.PERMISSION_CONTROL_CAR_CLIMATE, 365 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 366 mProps.put(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE, new Pair<>( 367 Car.PERMISSION_CONTROL_CAR_CLIMATE, 368 null)); 369 mProps.put(VehicleProperty.HVAC_AUTO_RECIRC_ON, new Pair<>( 370 Car.PERMISSION_CONTROL_CAR_CLIMATE, 371 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 372 mProps.put(VehicleProperty.HVAC_SEAT_VENTILATION, new Pair<>( 373 Car.PERMISSION_CONTROL_CAR_CLIMATE, 374 Car.PERMISSION_CONTROL_CAR_CLIMATE)); 375 376 // Info properties 377 mProps.put(VehicleProperty.INFO_VIN, new Pair<>( 378 Car.PERMISSION_IDENTIFICATION, 379 null)); 380 mProps.put(VehicleProperty.INFO_MAKE, new Pair<>( 381 Car.PERMISSION_CAR_INFO, 382 null)); 383 mProps.put(VehicleProperty.INFO_MODEL, new Pair<>( 384 Car.PERMISSION_CAR_INFO, 385 null)); 386 mProps.put(VehicleProperty.INFO_MODEL_YEAR, new Pair<>( 387 Car.PERMISSION_CAR_INFO, 388 null)); 389 mProps.put(VehicleProperty.INFO_FUEL_CAPACITY, new Pair<>( 390 Car.PERMISSION_CAR_INFO, 391 null)); 392 mProps.put(VehicleProperty.INFO_FUEL_TYPE, new Pair<>( 393 Car.PERMISSION_CAR_INFO, 394 null)); 395 mProps.put(VehicleProperty.INFO_EV_BATTERY_CAPACITY, new Pair<>( 396 Car.PERMISSION_CAR_INFO, 397 null)); 398 mProps.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, new Pair<>( 399 Car.PERMISSION_CAR_INFO, 400 null)); 401 mProps.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, new Pair<>( 402 Car.PERMISSION_CAR_INFO, 403 null)); 404 mProps.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, new Pair<>( 405 Car.PERMISSION_CAR_INFO, 406 null)); 407 mProps.put(VehicleProperty.INFO_EV_PORT_LOCATION, new Pair<>( 408 Car.PERMISSION_CAR_INFO, 409 null)); 410 mProps.put(VehicleProperty.INFO_DRIVER_SEAT, new Pair<>( 411 Car.PERMISSION_CAR_INFO, 412 null)); 413 mProps.put(VehicleProperty.INFO_EXTERIOR_DIMENSIONS, new Pair<>( 414 Car.PERMISSION_CAR_INFO, 415 null)); 416 417 // Sensor properties 418 mProps.put(VehicleProperty.PERF_ODOMETER, new Pair<>( 419 Car.PERMISSION_MILEAGE, 420 null)); 421 mProps.put(VehicleProperty.PERF_VEHICLE_SPEED, new Pair<>( 422 Car.PERMISSION_SPEED, 423 null)); 424 mProps.put(VehicleProperty.PERF_VEHICLE_SPEED_DISPLAY, new Pair<>( 425 Car.PERMISSION_SPEED, 426 null)); 427 mProps.put(VehicleProperty.ENGINE_COOLANT_TEMP, new Pair<>( 428 Car.PERMISSION_CAR_ENGINE_DETAILED, 429 null)); 430 mProps.put(VehicleProperty.ENGINE_OIL_LEVEL, new Pair<>( 431 Car.PERMISSION_CAR_ENGINE_DETAILED, 432 null)); 433 mProps.put(VehicleProperty.ENGINE_OIL_TEMP, new Pair<>( 434 Car.PERMISSION_CAR_ENGINE_DETAILED, 435 null)); 436 mProps.put(VehicleProperty.ENGINE_RPM, new Pair<>( 437 Car.PERMISSION_CAR_ENGINE_DETAILED, 438 null)); 439 mProps.put(VehicleProperty.WHEEL_TICK, new Pair<>( 440 Car.PERMISSION_SPEED, 441 null)); 442 mProps.put(VehicleProperty.FUEL_LEVEL, new Pair<>( 443 Car.PERMISSION_ENERGY, 444 null)); 445 mProps.put(VehicleProperty.FUEL_DOOR_OPEN, new Pair<>( 446 Car.PERMISSION_ENERGY_PORTS, 447 Car.PERMISSION_CONTROL_ENERGY_PORTS)); 448 mProps.put(VehicleProperty.EV_BATTERY_LEVEL, new Pair<>( 449 Car.PERMISSION_ENERGY, 450 null)); 451 mProps.put(VehicleProperty.EV_CHARGE_CURRENT_DRAW_LIMIT, new Pair<>( 452 Car.PERMISSION_ENERGY, Car.PERMISSION_CONTROL_CAR_ENERGY)); 453 mProps.put(VehicleProperty.EV_CHARGE_PERCENT_LIMIT, new Pair<>( 454 Car.PERMISSION_ENERGY, Car.PERMISSION_CONTROL_CAR_ENERGY)); 455 mProps.put(VehicleProperty.EV_CHARGE_STATE, new Pair<>( 456 Car.PERMISSION_ENERGY, null)); 457 mProps.put(VehicleProperty.EV_CHARGE_SWITCH, new Pair<>( 458 Car.PERMISSION_ENERGY, Car.PERMISSION_CONTROL_CAR_ENERGY)); 459 mProps.put(VehicleProperty.EV_CHARGE_TIME_REMAINING, new Pair<>( 460 Car.PERMISSION_ENERGY, null)); 461 mProps.put(VehicleProperty.EV_REGENERATIVE_BRAKING_STATE, new Pair<>( 462 Car.PERMISSION_ENERGY, null)); 463 mProps.put(VehicleProperty.EV_CHARGE_PORT_OPEN, new Pair<>( 464 Car.PERMISSION_ENERGY_PORTS, 465 Car.PERMISSION_CONTROL_ENERGY_PORTS)); 466 mProps.put(VehicleProperty.EV_CHARGE_PORT_CONNECTED, new Pair<>( 467 Car.PERMISSION_ENERGY_PORTS, 468 null)); 469 mProps.put(VehicleProperty.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE, new Pair<>( 470 Car.PERMISSION_ENERGY, 471 null)); 472 mProps.put(VehicleProperty.RANGE_REMAINING, new Pair<>( 473 Car.PERMISSION_ENERGY, 474 Car.PERMISSION_ADJUST_RANGE_REMAINING)); 475 mProps.put(VehicleProperty.TIRE_PRESSURE, new Pair<>( 476 Car.PERMISSION_TIRES, 477 null)); 478 mProps.put(VehicleProperty.CRITICALLY_LOW_TIRE_PRESSURE, new Pair<>( 479 Car.PERMISSION_TIRES, 480 null)); 481 mProps.put(VehicleProperty.PERF_STEERING_ANGLE, new Pair<>( 482 Car.PERMISSION_READ_STEERING_STATE, 483 null)); 484 mProps.put(VehicleProperty.PERF_REAR_STEERING_ANGLE, new Pair<>( 485 Car.PERMISSION_READ_STEERING_STATE, 486 null)); 487 mProps.put(VehicleProperty.GEAR_SELECTION, new Pair<>( 488 Car.PERMISSION_POWERTRAIN, 489 null)); 490 mProps.put(VehicleProperty.CURRENT_GEAR, new Pair<>( 491 Car.PERMISSION_POWERTRAIN, 492 null)); 493 mProps.put(VehicleProperty.PARKING_BRAKE_ON, new Pair<>( 494 Car.PERMISSION_POWERTRAIN, 495 null)); 496 mProps.put(VehicleProperty.PARKING_BRAKE_AUTO_APPLY, new Pair<>( 497 Car.PERMISSION_POWERTRAIN, 498 null)); 499 mProps.put(VehicleProperty.FUEL_LEVEL_LOW, new Pair<>( 500 Car.PERMISSION_ENERGY, 501 null)); 502 mProps.put(VehicleProperty.NIGHT_MODE, new Pair<>( 503 Car.PERMISSION_EXTERIOR_ENVIRONMENT, 504 null)); 505 mProps.put(VehicleProperty.TURN_SIGNAL_STATE, new Pair<>( 506 Car.PERMISSION_EXTERIOR_LIGHTS, 507 null)); 508 mProps.put(VehicleProperty.IGNITION_STATE, new Pair<>( 509 Car.PERMISSION_POWERTRAIN, 510 null)); 511 mProps.put(VehicleProperty.ABS_ACTIVE, new Pair<>( 512 Car.PERMISSION_CAR_DYNAMICS_STATE, 513 null)); 514 mProps.put(VehicleProperty.TRACTION_CONTROL_ACTIVE, new Pair<>( 515 Car.PERMISSION_CAR_DYNAMICS_STATE, 516 null)); 517 mProps.put(VehicleProperty.ENV_OUTSIDE_TEMPERATURE, new Pair<>( 518 Car.PERMISSION_EXTERIOR_ENVIRONMENT, 519 null)); 520 mProps.put(VehicleProperty.HEADLIGHTS_STATE, new Pair<>( 521 Car.PERMISSION_EXTERIOR_LIGHTS, 522 null)); 523 mProps.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, new Pair<>( 524 Car.PERMISSION_EXTERIOR_LIGHTS, 525 null)); 526 mProps.put(VehicleProperty.FOG_LIGHTS_STATE, new Pair<>( 527 Car.PERMISSION_EXTERIOR_LIGHTS, 528 null)); 529 mProps.put(VehicleProperty.FRONT_FOG_LIGHTS_STATE, new Pair<>( 530 Car.PERMISSION_EXTERIOR_LIGHTS, 531 null)); 532 mProps.put(VehicleProperty.REAR_FOG_LIGHTS_STATE, new Pair<>( 533 Car.PERMISSION_EXTERIOR_LIGHTS, 534 null)); 535 mProps.put(VehicleProperty.HAZARD_LIGHTS_STATE, new Pair<>( 536 Car.PERMISSION_EXTERIOR_LIGHTS, 537 null)); 538 mProps.put(VehicleProperty.HEADLIGHTS_SWITCH, new Pair<>( 539 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS, 540 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)); 541 mProps.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, new Pair<>( 542 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS, 543 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)); 544 mProps.put(VehicleProperty.FOG_LIGHTS_SWITCH, new Pair<>( 545 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS, 546 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)); 547 mProps.put(VehicleProperty.FRONT_FOG_LIGHTS_SWITCH, new Pair<>( 548 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS, 549 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)); 550 mProps.put(VehicleProperty.REAR_FOG_LIGHTS_SWITCH, new Pair<>( 551 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS, 552 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)); 553 mProps.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, new Pair<>( 554 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS, 555 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS)); 556 mProps.put(VehicleProperty.READING_LIGHTS_STATE, new Pair<>( 557 Car.PERMISSION_READ_INTERIOR_LIGHTS, 558 null)); 559 mProps.put(VehicleProperty.CABIN_LIGHTS_STATE, new Pair<>( 560 Car.PERMISSION_READ_INTERIOR_LIGHTS, 561 null)); 562 mProps.put(VehicleProperty.READING_LIGHTS_SWITCH, new Pair<>( 563 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS, 564 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)); 565 mProps.put(VehicleProperty.CABIN_LIGHTS_SWITCH, new Pair<>( 566 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS, 567 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS)); 568 mProps.put(VehicleProperty.ANDROID_EPOCH_TIME, new Pair<>( 569 null, 570 Car.PERMISSION_CAR_EPOCH_TIME)); 571 mProps.put(VehicleProperty.STORAGE_ENCRYPTION_BINDING_SEED, new Pair<>( 572 Car.PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED, 573 Car.PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED)); 574 // Display_Units 575 mProps.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, new Pair<>( 576 Car.PERMISSION_READ_DISPLAY_UNITS, 577 Car.PERMISSION_CONTROL_DISPLAY_UNITS)); 578 mPropForUnits.add(VehicleProperty.DISTANCE_DISPLAY_UNITS); 579 mProps.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, new Pair<>( 580 Car.PERMISSION_READ_DISPLAY_UNITS, 581 Car.PERMISSION_CONTROL_DISPLAY_UNITS)); 582 mPropForUnits.add(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS); 583 mProps.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, new Pair<>( 584 Car.PERMISSION_READ_DISPLAY_UNITS, 585 Car.PERMISSION_CONTROL_DISPLAY_UNITS)); 586 mPropForUnits.add(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS); 587 mProps.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, new Pair<>( 588 Car.PERMISSION_READ_DISPLAY_UNITS, 589 Car.PERMISSION_CONTROL_DISPLAY_UNITS)); 590 mPropForUnits.add(VehicleProperty.EV_BATTERY_DISPLAY_UNITS); 591 mProps.put(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, new Pair<>( 592 Car.PERMISSION_READ_DISPLAY_UNITS, 593 Car.PERMISSION_CONTROL_DISPLAY_UNITS)); 594 mPropForUnits.add(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME); 595 mProps.put(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS, new Pair<>( 596 Car.PERMISSION_READ_DISPLAY_UNITS, 597 Car.PERMISSION_CONTROL_DISPLAY_UNITS)); 598 mPropForUnits.add(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS); 599 600 mProps.put(VehicleProperty.SUPPORT_CUSTOMIZE_VENDOR_PERMISSION, new Pair<>( 601 Car.PERMISSION_READ_CAR_VENDOR_PERMISSION_INFO, 602 null)); 603 mProps.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, new Pair<>( 604 Car.PERMISSION_CAR_INFO, 605 null)); 606 mProps.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, new Pair<>( 607 Car.PERMISSION_CAR_INFO, 608 null)); 609 mProps.put(VehicleProperty.VEHICLE_CURB_WEIGHT, new Pair<>( 610 Car.PERMISSION_PRIVILEGED_CAR_INFO, null)); 611 mProps.put(VehicleProperty.TRAILER_PRESENT, new Pair<>( 612 Car.PERMISSION_PRIVILEGED_CAR_INFO, null)); 613 614 mProps.put(PROP_GENERAL_SAFETY_REGULATION_COMPLIANCE, 615 new Pair<>(Car.PERMISSION_CAR_INFO, null)); 616 // mPropToValidValue should contain all properties which has @data_enum in types.hal 617 mPropToValidValue.put(VehicleProperty.INFO_FUEL_TYPE, FUEL_TYPE); 618 mPropToValidValue.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, EV_CONNECTOR_TYPE); 619 mPropToValidValue.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, PORT_LOCATION); 620 mPropToValidValue.put(VehicleProperty.INFO_DRIVER_SEAT, VEHICLE_SEAT); 621 mPropToValidValue.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, PORT_LOCATION); 622 mPropToValidValue.put(VehicleProperty.ENGINE_OIL_LEVEL, OIL_LEVEL); 623 mPropToValidValue.put(VehicleProperty.GEAR_SELECTION, VEHICLE_GEAR); 624 mPropToValidValue.put(VehicleProperty.CURRENT_GEAR, VEHICLE_GEAR); 625 mPropToValidValue.put(VehicleProperty.TURN_SIGNAL_STATE, TURN_SIGNAL); 626 mPropToValidValue.put(VehicleProperty.IGNITION_STATE, IGNITION_STATE); 627 mPropToValidValue.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_UNITS); 628 mPropToValidValue.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, VEHICLE_UNITS); 629 mPropToValidValue.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, VEHICLE_UNITS); 630 mPropToValidValue.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, VEHICLE_UNITS); 631 mPropToValidValue.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, VEHICLE_UNITS); 632 mPropToValidValue.put(VehicleProperty.SEAT_OCCUPANCY, SEAT_OCCUPANCY_STATE); 633 mPropToValidValue.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 634 mPropToValidValue.put(VehicleProperty.HEADLIGHTS_STATE, VEHICLE_LIGHT_STATE); 635 mPropToValidValue.put(VehicleProperty.FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 636 mPropToValidValue.put(VehicleProperty.FRONT_FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 637 mPropToValidValue.put(VehicleProperty.REAR_FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 638 mPropToValidValue.put(VehicleProperty.HAZARD_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 639 mPropToValidValue.put(VehicleProperty.CABIN_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 640 mPropToValidValue.put(VehicleProperty.READING_LIGHTS_STATE, VEHICLE_LIGHT_STATE); 641 mPropToValidValue.put(VehicleProperty.EV_CHARGE_STATE, EV_CHARGE_STATE); 642 mPropToValidValue.put(VehicleProperty.EV_REGENERATIVE_BRAKING_STATE, 643 EV_REGENERATIVE_BREAKING_STATE); 644 mPropToValidValue.put(VehicleProperty.HEADLIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 645 mPropToValidValue.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 646 mPropToValidValue.put(VehicleProperty.FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 647 mPropToValidValue.put(VehicleProperty.FRONT_FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 648 mPropToValidValue.put(VehicleProperty.REAR_FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 649 mPropToValidValue.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 650 mPropToValidValue.put(VehicleProperty.CABIN_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 651 mPropToValidValue.put(VehicleProperty.READING_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH); 652 mPropToValidValue.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, 653 ETC_CARD_STATUS); 654 mPropToValidValue.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, 655 ETC_CARD_TYPE); 656 mPropToValidValue.put(VehicleProperty.TRAILER_PRESENT, 657 TRAILER_PRESENT); 658 // mPropToValidBitFlag contains all properties which return values are combinations of bits 659 mPropToValidBitFlag.put(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE, 660 HVAC_FAN_DIRECTION_COMBINATIONS); 661 mPropToValidBitFlag.put(VehicleProperty.HVAC_FAN_DIRECTION, 662 HVAC_FAN_DIRECTION_COMBINATIONS); 663 } 664 665 /** 666 * @param propId Property ID 667 * @return Read permission string for given property ID. NULL if property ID does not exist or 668 * the property is not available for reading. 669 */ 670 @Nullable getReadPermission(int propId)671 public String getReadPermission(int propId) { 672 Pair<String, String> p = mProps.get(propId); 673 if (p != null) { 674 // Property ID exists. Return read permission. 675 if (p.first == null) { 676 Slogf.e(TAG, "propId is not available for reading : 0x" + toHexString(propId)); 677 } 678 return p.first; 679 } else if (isVendorProperty(propId)) { 680 // if property is vendor property and do not have specific permission. 681 return Car.PERMISSION_VENDOR_EXTENSION; 682 } else { 683 return null; 684 } 685 } 686 687 /** 688 * @param propId Property ID 689 * @return Write permission string for given property ID. NULL if property ID does not exist or 690 * the property is not writable. 691 */ 692 @Nullable getWritePermission(int propId)693 public String getWritePermission(int propId) { 694 Pair<String, String> p = mProps.get(propId); 695 if (p != null) { 696 // Property ID exists. Return write permission. 697 if (p.second == null) { 698 Slogf.e(TAG, "propId is not writable : 0x" + toHexString(propId)); 699 } 700 return p.second; 701 } else if (isVendorProperty(propId)) { 702 // if property is vendor property and do not have specific permission. 703 return Car.PERMISSION_VENDOR_EXTENSION; 704 } else { 705 return null; 706 } 707 } 708 isVendorProperty(int propId)709 private static boolean isVendorProperty(int propId) { 710 return (propId & VehiclePropertyGroup.MASK) == VehiclePropertyGroup.VENDOR; 711 } 712 /** 713 * Check if property ID is in the list of known IDs that PropertyHalService is interested it. 714 */ isSupportedProperty(int propId)715 public boolean isSupportedProperty(int propId) { 716 // Property is in the list of supported properties 717 return mProps.get(propId) != null || isVendorProperty(propId); 718 } 719 720 /** 721 * Check if the property is one of display units properties. 722 */ isPropertyToChangeUnits(int propertyId)723 public boolean isPropertyToChangeUnits(int propertyId) { 724 return mPropForUnits.contains(propertyId); 725 } 726 727 /** 728 * Overrides the permission map for vendor properties 729 * 730 * @param configArray the configArray for 731 * {@link VehicleProperty#SUPPORT_CUSTOMIZE_VENDOR_PERMISSION} 732 */ customizeVendorPermission(@onNull int[] configArray)733 public void customizeVendorPermission(@NonNull int[] configArray) { 734 if (configArray == null || configArray.length % 3 != 0) { 735 throw new IllegalArgumentException( 736 "ConfigArray for SUPPORT_CUSTOMIZE_VENDOR_PERMISSION is wrong"); 737 } 738 int index = 0; 739 while (index < configArray.length) { 740 int propId = configArray[index++]; 741 if (!isVendorProperty(propId)) { 742 throw new IllegalArgumentException("Property Id: " + propId 743 + " is not in vendor range"); 744 } 745 int readPermission = configArray[index++]; 746 int writePermission = configArray[index++]; 747 mProps.put(propId, new Pair<>( 748 toPermissionString(readPermission, propId), 749 toPermissionString(writePermission, propId))); 750 } 751 752 } 753 754 /** 755 * Map VehicleVendorPermission enums in VHAL to android permissions. 756 * 757 * @return permission string, return null if vendor property is not available. 758 */ 759 @Nullable toPermissionString(int permissionEnum, int propId)760 private String toPermissionString(int permissionEnum, int propId) { 761 switch (permissionEnum) { 762 case PERMISSION_CAR_VENDOR_DEFAULT: 763 return Car.PERMISSION_VENDOR_EXTENSION; 764 case PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW: 765 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW; 766 case PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW: 767 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW; 768 case PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR: 769 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR; 770 case PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR: 771 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR; 772 case PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT: 773 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT; 774 case PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT: 775 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT; 776 case PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR: 777 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR; 778 case PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR: 779 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR; 780 case PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO: 781 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO; 782 case PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO: 783 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO; 784 case PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE: 785 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE; 786 case PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE: 787 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE; 788 case PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC: 789 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC; 790 case PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC: 791 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC; 792 case PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT: 793 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT; 794 case PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT: 795 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT; 796 case PERMISSION_SET_CAR_VENDOR_CATEGORY_1: 797 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_1; 798 case PERMISSION_GET_CAR_VENDOR_CATEGORY_1: 799 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_1; 800 case PERMISSION_SET_CAR_VENDOR_CATEGORY_2: 801 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_2; 802 case PERMISSION_GET_CAR_VENDOR_CATEGORY_2: 803 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_2; 804 case PERMISSION_SET_CAR_VENDOR_CATEGORY_3: 805 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_3; 806 case PERMISSION_GET_CAR_VENDOR_CATEGORY_3: 807 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_3; 808 case PERMISSION_SET_CAR_VENDOR_CATEGORY_4: 809 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_4; 810 case PERMISSION_GET_CAR_VENDOR_CATEGORY_4: 811 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_4; 812 case PERMISSION_SET_CAR_VENDOR_CATEGORY_5: 813 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_5; 814 case PERMISSION_GET_CAR_VENDOR_CATEGORY_5: 815 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_5; 816 case PERMISSION_SET_CAR_VENDOR_CATEGORY_6: 817 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_6; 818 case PERMISSION_GET_CAR_VENDOR_CATEGORY_6: 819 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_6; 820 case PERMISSION_SET_CAR_VENDOR_CATEGORY_7: 821 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_7; 822 case PERMISSION_GET_CAR_VENDOR_CATEGORY_7: 823 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_7; 824 case PERMISSION_SET_CAR_VENDOR_CATEGORY_8: 825 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_8; 826 case PERMISSION_GET_CAR_VENDOR_CATEGORY_8: 827 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_8; 828 case PERMISSION_SET_CAR_VENDOR_CATEGORY_9: 829 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_9; 830 case PERMISSION_GET_CAR_VENDOR_CATEGORY_9: 831 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_9; 832 case PERMISSION_SET_CAR_VENDOR_CATEGORY_10: 833 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_10; 834 case PERMISSION_GET_CAR_VENDOR_CATEGORY_10: 835 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_10; 836 case PERMISSION_CAR_VENDOR_NOT_ACCESSIBLE: 837 return null; 838 default: 839 throw new IllegalArgumentException("permission Id: " + permissionEnum 840 + " for property:" + propId + " is invalid vendor permission Id"); 841 } 842 } 843 844 /** 845 * Checks property value's format for all properties. Checks property value range if property 846 * has @data_enum flag in types.hal. 847 * @return true if property value's payload is valid. 848 */ checkPayload(HalPropValue propValue)849 public boolean checkPayload(HalPropValue propValue) { 850 int propId = propValue.getPropId(); 851 // Mixed property uses config array to indicate the data format. Checked it when convert it 852 // to CarPropertyValue. 853 if ((propId & VehiclePropertyType.MASK) == VehiclePropertyType.MIXED) { 854 return true; 855 } 856 if (!checkFormatForAllProperties(propValue)) { 857 Slogf.e(TAG, "Property value" + propValue + "has an invalid data format"); 858 return false; 859 } 860 if (mPropToValidValue.containsKey(propId)) { 861 return checkDataEnum(propValue); 862 } 863 if (mPropToValidBitFlag.containsKey(propId)) { 864 return checkValidBitFlag(propValue); 865 } 866 return true; 867 } 868 checkValidBitFlag(HalPropValue propValue)869 private boolean checkValidBitFlag(HalPropValue propValue) { 870 int flagCombination = mPropToValidBitFlag.get(propValue.getPropId()); 871 for (int i = 0; i < propValue.getInt32ValuesSize(); i++) { 872 int value = propValue.getInt32Value(i); 873 if ((value & flagCombination) != value) { 874 return false; 875 } 876 } 877 return true; 878 } 879 checkFormatForAllProperties(HalPropValue propValue)880 private boolean checkFormatForAllProperties(HalPropValue propValue) { 881 int propId = propValue.getPropId(); 882 //Records sum size of int32values, floatValue, int64Values, bytes, String 883 int sizeOfAllValue = propValue.getInt32ValuesSize() + propValue.getFloatValuesSize() 884 + propValue.getInt64ValuesSize() + propValue.getByteValuesSize() 885 + propValue.getStringValue().length(); 886 if (sizeOfAllValue == 0) { 887 Slogf.e(TAG, "Property value is empty: " + propValue); 888 return false; 889 } 890 switch (propId & VehiclePropertyType.MASK) { 891 case VehiclePropertyType.BOOLEAN: 892 case VehiclePropertyType.INT32: 893 return sizeOfAllValue == 1 && propValue.getInt32ValuesSize() == 1; 894 case VehiclePropertyType.FLOAT: 895 return sizeOfAllValue == 1 && propValue.getFloatValuesSize() == 1; 896 case VehiclePropertyType.INT64: 897 return sizeOfAllValue == 1 && propValue.getInt64ValuesSize() == 1; 898 case VehiclePropertyType.FLOAT_VEC: 899 return sizeOfAllValue == propValue.getFloatValuesSize(); 900 case VehiclePropertyType.INT64_VEC: 901 return sizeOfAllValue == propValue.getInt64ValuesSize(); 902 case VehiclePropertyType.INT32_VEC: 903 return sizeOfAllValue == propValue.getInt32ValuesSize(); 904 case VehiclePropertyType.BYTES: 905 return sizeOfAllValue == propValue.getByteValuesSize(); 906 case VehiclePropertyType.STRING: 907 return sizeOfAllValue == propValue.getStringValue().length(); 908 default: 909 throw new IllegalArgumentException("Unexpected property type for propId: " 910 + Integer.toHexString(propId)); 911 } 912 } checkDataEnum(HalPropValue propValue)913 private boolean checkDataEnum(HalPropValue propValue) { 914 int propId = propValue.getPropId(); 915 Set<Integer> validValue = mPropToValidValue.get(propId); 916 for (int i = 0; i < propValue.getInt32ValuesSize(); i++) { 917 if (!validValue.contains(propValue.getInt32Value(i))) { 918 return false; 919 } 920 } 921 return true; 922 } 923 getIntegersFromDataEnums(Class clazz)924 private static List<Integer> getIntegersFromDataEnums(Class clazz) { 925 Field[] fields = clazz.getDeclaredFields(); 926 List<Integer> integerList = new ArrayList<>(5); 927 for (Field f : fields) { 928 if (f.getType() == int.class) { 929 try { 930 integerList.add(f.getInt(clazz)); 931 } catch (IllegalAccessException | RuntimeException e) { 932 Slogf.w(TAG, "Failed to get value"); 933 } 934 } 935 } 936 return integerList; 937 } 938 939 // Generate all combinations at once generateAllCombination(Class clazz)940 private static int generateAllCombination(Class clazz) { 941 List<Integer> allBits = getIntegersFromDataEnums(clazz); 942 int combination = allBits.get(0); 943 for (int i = 1; i < allBits.size(); i++) { 944 combination |= allBits.get(i); 945 } 946 return combination; 947 } 948 } 949