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