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