1 /* 2 * Copyright (C) 2016 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 #ifndef android_hardware_automotive_vehicle_V2_0_impl_DefaultConfig_H_ 18 #define android_hardware_automotive_vehicle_V2_0_impl_DefaultConfig_H_ 19 20 #include <android/hardware/automotive/vehicle/2.0/IVehicle.h> 21 #include <vhal_v2_0/VehicleUtils.h> 22 23 namespace android { 24 namespace hardware { 25 namespace automotive { 26 namespace vehicle { 27 namespace V2_0 { 28 29 namespace impl { 30 // 31 // Some handy constants to avoid conversions from enum to int. 32 constexpr int ABS_ACTIVE = (int)VehicleProperty::ABS_ACTIVE; 33 constexpr int AP_POWER_STATE_REQ = (int)VehicleProperty::AP_POWER_STATE_REQ; 34 constexpr int AP_POWER_STATE_REPORT = (int)VehicleProperty::AP_POWER_STATE_REPORT; 35 constexpr int DOOR_1_LEFT = (int)VehicleAreaDoor::ROW_1_LEFT; 36 constexpr int DOOR_1_RIGHT = (int)VehicleAreaDoor::ROW_1_RIGHT; 37 constexpr int OBD2_LIVE_FRAME = (int)VehicleProperty::OBD2_LIVE_FRAME; 38 constexpr int OBD2_FREEZE_FRAME = (int)VehicleProperty::OBD2_FREEZE_FRAME; 39 constexpr int OBD2_FREEZE_FRAME_INFO = (int)VehicleProperty::OBD2_FREEZE_FRAME_INFO; 40 constexpr int OBD2_FREEZE_FRAME_CLEAR = (int)VehicleProperty::OBD2_FREEZE_FRAME_CLEAR; 41 constexpr int TRACTION_CONTROL_ACTIVE = (int)VehicleProperty::TRACTION_CONTROL_ACTIVE; 42 constexpr int VEHICLE_MAP_SERVICE = (int)VehicleProperty::VEHICLE_MAP_SERVICE; 43 constexpr int WHEEL_TICK = (int)VehicleProperty::WHEEL_TICK; 44 constexpr int ALL_WHEELS = 45 (int)(VehicleAreaWheel::LEFT_FRONT | VehicleAreaWheel::RIGHT_FRONT | 46 VehicleAreaWheel::LEFT_REAR | VehicleAreaWheel::RIGHT_REAR); 47 constexpr int HVAC_LEFT = (int)(VehicleAreaSeat::ROW_1_LEFT | VehicleAreaSeat::ROW_2_LEFT | 48 VehicleAreaSeat::ROW_2_CENTER); 49 constexpr int HVAC_RIGHT = (int)(VehicleAreaSeat::ROW_1_RIGHT | VehicleAreaSeat::ROW_2_RIGHT); 50 constexpr int HVAC_ALL = HVAC_LEFT | HVAC_RIGHT; 51 52 /** 53 * This property is used for test purpose to generate fake events. Here is the test package that 54 * is referencing this property definition: packages/services/Car/tests/vehiclehal_test 55 */ 56 const int32_t kGenerateFakeDataControllingProperty = 57 0x0666 | VehiclePropertyGroup::VENDOR | VehicleArea::GLOBAL | VehiclePropertyType::MIXED; 58 59 /** 60 * FakeDataCommand enum defines the supported command type for kGenerateFakeDataControllingProperty. 61 * All those commands can be send independently with each other. And each will override the one sent 62 * previously. 63 * 64 * The controlling property has the following format: 65 * 66 * int32Values[0] - command enum defined in FakeDataCommand 67 * 68 * The format of the arguments is defined for each command type as below: 69 */ 70 enum class FakeDataCommand : int32_t { 71 /** 72 * Starts linear fake data generation. Caller must provide additional data: 73 * int32Values[1] - VehicleProperty to which command applies 74 * int64Values[0] - periodic interval in nanoseconds 75 * floatValues[0] - initial value 76 * floatValues[1] - dispersion defines the min/max value relative to initial value, where 77 * max = initial_value + dispersion, min = initial_value - dispersion. 78 * Dispersion should be non-negative, otherwise the behavior is undefined. 79 * floatValues[2] - increment, with every timer tick the value will be incremented by this 80 * amount. When reaching to max value, the current value will be set to min. 81 * It should be non-negative, otherwise the behavior is undefined. 82 */ 83 StartLinear = 0, 84 85 /** Stops generating of fake data that was triggered by Start commands. 86 * int32Values[1] - VehicleProperty to which command applies. VHAL will stop the 87 * corresponding linear generation for that property. 88 */ 89 StopLinear = 1, 90 91 /** 92 * Starts JSON-based fake data generation. Caller must provide a string value specifying 93 * the path to fake value JSON file: 94 * stringValue - path to the fake values JSON file 95 */ 96 StartJson = 2, 97 98 /** 99 * Stops JSON-based fake data generation. No additional arguments needed. 100 */ 101 StopJson = 3, 102 103 /** 104 * Injects key press event (HAL incorporates UP/DOWN acction and triggers 2 HAL events for every 105 * key-press). We set the enum with high number to leave space for future start/stop commands. 106 * Caller must provide the following data: 107 * int32Values[2] - Android key code 108 * int32Values[3] - target display (0 - for main display, 1 - for instrument cluster, see 109 * VehicleDisplay) 110 */ 111 KeyPress = 100, 112 }; 113 114 const int32_t kHvacPowerProperties[] = { 115 toInt(VehicleProperty::HVAC_FAN_SPEED), 116 toInt(VehicleProperty::HVAC_FAN_DIRECTION), 117 }; 118 119 struct ConfigDeclaration { 120 VehiclePropConfig config; 121 122 /* This value will be used as an initial value for the property. If this field is specified for 123 * property that supports multiple areas then it will be used for all areas unless particular 124 * area is overridden in initialAreaValue field. */ 125 VehiclePropValue::RawValue initialValue; 126 /* Use initialAreaValues if it is necessary to specify different values per each area. */ 127 std::map<int32_t, VehiclePropValue::RawValue> initialAreaValues; 128 }; 129 130 const ConfigDeclaration kVehicleProperties[]{ 131 {.config = 132 { 133 .prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY), 134 .access = VehiclePropertyAccess::READ, 135 .changeMode = VehiclePropertyChangeMode::STATIC, 136 }, 137 .initialValue = {.floatValues = {15000}}}, 138 139 {.config = 140 { 141 .prop = toInt(VehicleProperty::INFO_FUEL_TYPE), 142 .access = VehiclePropertyAccess::READ, 143 .changeMode = VehiclePropertyChangeMode::STATIC, 144 }, 145 .initialValue = {.int32Values = {1}}}, 146 147 {.config = 148 { 149 .prop = toInt(VehicleProperty::INFO_EV_BATTERY_CAPACITY), 150 .access = VehiclePropertyAccess::READ, 151 .changeMode = VehiclePropertyChangeMode::STATIC, 152 }, 153 .initialValue = {.floatValues = {150000}}}, 154 155 {.config = 156 { 157 .prop = toInt(VehicleProperty::INFO_EV_CONNECTOR_TYPE), 158 .access = VehiclePropertyAccess::READ, 159 .changeMode = VehiclePropertyChangeMode::STATIC, 160 }, 161 .initialValue = {.int32Values = {1}}}, 162 163 {.config = 164 { 165 .prop = toInt(VehicleProperty::INFO_MAKE), 166 .access = VehiclePropertyAccess::READ, 167 .changeMode = VehiclePropertyChangeMode::STATIC, 168 }, 169 .initialValue = {.stringValue = "Toy Vehicle"}}, 170 {.config = 171 { 172 .prop = toInt(VehicleProperty::PERF_VEHICLE_SPEED), 173 .access = VehiclePropertyAccess::READ, 174 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 175 .minSampleRate = 1.0f, 176 .maxSampleRate = 10.0f, 177 }, 178 .initialValue = {.floatValues = {0.0f}}}, 179 180 {.config = 181 { 182 .prop = toInt(VehicleProperty::PERF_ODOMETER), 183 .access = VehiclePropertyAccess::READ, 184 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 185 }, 186 .initialValue = {.floatValues = {0.0f}}}, 187 188 { 189 .config = 190 { 191 .prop = toInt(VehicleProperty::ENGINE_RPM), 192 .access = VehiclePropertyAccess::READ, 193 .changeMode = VehiclePropertyChangeMode::CONTINUOUS, 194 .minSampleRate = 1.0f, 195 .maxSampleRate = 10.0f, 196 }, 197 .initialValue = {.floatValues = {0.0f}}, 198 }, 199 200 {.config = 201 { 202 .prop = toInt(VehicleProperty::FUEL_LEVEL), 203 .access = VehiclePropertyAccess::READ, 204 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 205 }, 206 .initialValue = {.floatValues = {15000}}}, 207 208 {.config = 209 { 210 .prop = toInt(VehicleProperty::FUEL_DOOR_OPEN), 211 .access = VehiclePropertyAccess::READ, 212 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 213 }, 214 .initialValue = {.int32Values = {0}}}, 215 216 {.config = 217 { 218 .prop = toInt(VehicleProperty::EV_BATTERY_LEVEL), 219 .access = VehiclePropertyAccess::READ, 220 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 221 }, 222 .initialValue = {.floatValues = {150000}}}, 223 224 {.config = 225 { 226 .prop = toInt(VehicleProperty::EV_CHARGE_PORT_OPEN), 227 .access = VehiclePropertyAccess::READ, 228 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 229 }, 230 .initialValue = {.int32Values = {0}}}, 231 232 {.config = 233 { 234 .prop = toInt(VehicleProperty::EV_CHARGE_PORT_CONNECTED), 235 .access = VehiclePropertyAccess::READ, 236 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 237 }, 238 .initialValue = {.int32Values = {0}}}, 239 240 {.config = 241 { 242 .prop = toInt(VehicleProperty::EV_BATTERY_INSTANTANEOUS_CHARGE_RATE), 243 .access = VehiclePropertyAccess::READ, 244 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 245 }, 246 .initialValue = {.floatValues = {0}}}, 247 248 {.config = 249 { 250 .prop = toInt(VehicleProperty::CURRENT_GEAR), 251 .access = VehiclePropertyAccess::READ, 252 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 253 }, 254 .initialValue = {.int32Values = {toInt(VehicleGear::GEAR_PARK)}}}, 255 256 {.config = 257 { 258 .prop = toInt(VehicleProperty::PARKING_BRAKE_ON), 259 .access = VehiclePropertyAccess::READ, 260 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 261 }, 262 .initialValue = {.int32Values = {1}}}, 263 264 {.config = 265 { 266 .prop = toInt(VehicleProperty::FUEL_LEVEL_LOW), 267 .access = VehiclePropertyAccess::READ, 268 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 269 }, 270 .initialValue = {.int32Values = {0}}}, 271 272 {.config = 273 { 274 .prop = toInt(VehicleProperty::HW_KEY_INPUT), 275 .access = VehiclePropertyAccess::READ, 276 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 277 }, 278 .initialValue = {.int32Values = {0, 0, 0}}}, 279 280 {.config = {.prop = toInt(VehicleProperty::HVAC_POWER_ON), 281 .access = VehiclePropertyAccess::READ_WRITE, 282 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 283 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}, 284 // TODO(bryaneyler): Ideally, this is generated dynamically from 285 // kHvacPowerProperties. 286 .configArray = 287 { 288 0x12400500, // HVAC_FAN_SPEED 289 0x12400501 // HVAC_FAN_DIRECTION 290 }}, 291 .initialValue = {.int32Values = {1}}}, 292 293 { 294 .config = {.prop = toInt(VehicleProperty::HVAC_DEFROSTER), 295 .access = VehiclePropertyAccess::READ_WRITE, 296 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 297 .areaConfigs = 298 {VehicleAreaConfig{.areaId = toInt(VehicleAreaWindow::FRONT_WINDSHIELD)}, 299 VehicleAreaConfig{.areaId = toInt(VehicleAreaWindow::REAR_WINDSHIELD)}}}, 300 .initialValue = {.int32Values = {0}} // Will be used for all areas. 301 }, 302 303 {.config = {.prop = toInt(VehicleProperty::HVAC_MAX_DEFROST_ON), 304 .access = VehiclePropertyAccess::READ_WRITE, 305 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 306 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 307 .initialValue = {.int32Values = {0}}}, 308 309 {.config = {.prop = toInt(VehicleProperty::HVAC_RECIRC_ON), 310 .access = VehiclePropertyAccess::READ_WRITE, 311 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 312 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 313 .initialValue = {.int32Values = {1}}}, 314 315 {.config = {.prop = toInt(VehicleProperty::HVAC_AUTO_RECIRC_ON), 316 .access = VehiclePropertyAccess::READ_WRITE, 317 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 318 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 319 .initialValue = {.int32Values = {0}}}, 320 321 {.config = {.prop = toInt(VehicleProperty::HVAC_AC_ON), 322 .access = VehiclePropertyAccess::READ_WRITE, 323 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 324 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 325 .initialValue = {.int32Values = {1}}}, 326 327 {.config = {.prop = toInt(VehicleProperty::HVAC_MAX_AC_ON), 328 .access = VehiclePropertyAccess::READ_WRITE, 329 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 330 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 331 .initialValue = {.int32Values = {0}}}, 332 333 {.config = {.prop = toInt(VehicleProperty::HVAC_AUTO_ON), 334 .access = VehiclePropertyAccess::READ_WRITE, 335 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 336 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 337 .initialValue = {.int32Values = {1}}}, 338 339 {.config = {.prop = toInt(VehicleProperty::HVAC_DUAL_ON), 340 .access = VehiclePropertyAccess::READ_WRITE, 341 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 342 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 343 .initialValue = {.int32Values = {0}}}, 344 345 {.config = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED), 346 .access = VehiclePropertyAccess::READ_WRITE, 347 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 348 .areaConfigs = {VehicleAreaConfig{ 349 .areaId = HVAC_ALL, .minInt32Value = 1, .maxInt32Value = 7}}}, 350 .initialValue = {.int32Values = {3}}}, 351 352 {.config = {.prop = toInt(VehicleProperty::HVAC_FAN_DIRECTION), 353 .access = VehiclePropertyAccess::READ_WRITE, 354 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 355 .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, 356 .initialValue = {.int32Values = {toInt(VehicleHvacFanDirection::FACE)}}}, 357 358 {.config = {.prop = toInt(VehicleProperty::HVAC_STEERING_WHEEL_HEAT), 359 .access = VehiclePropertyAccess::READ_WRITE, 360 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 361 .areaConfigs = {VehicleAreaConfig{ 362 .areaId = (0), .minInt32Value = -2, .maxInt32Value = 2}}}, 363 .initialValue = {.int32Values = {0}}}, // +ve values for heating and -ve for cooling 364 365 {.config = {.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET), 366 .access = VehiclePropertyAccess::READ_WRITE, 367 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 368 .areaConfigs = {VehicleAreaConfig{ 369 .areaId = HVAC_LEFT, .minFloatValue = 16, .maxFloatValue = 32, 370 }, 371 VehicleAreaConfig{ 372 .areaId = HVAC_RIGHT, .minFloatValue = 16, .maxFloatValue = 32, 373 }}}, 374 .initialAreaValues = {{HVAC_LEFT, {.floatValues = {16}}}, 375 {HVAC_RIGHT, {.floatValues = {20}}}}}, 376 377 {.config = 378 { 379 .prop = toInt(VehicleProperty::ENV_OUTSIDE_TEMPERATURE), 380 .access = VehiclePropertyAccess::READ, 381 // TODO(bryaneyler): Support ON_CHANGE as well. 382 .changeMode = VehiclePropertyChangeMode::CONTINUOUS, 383 .minSampleRate = 1.0f, 384 .maxSampleRate = 2.0f, 385 }, 386 .initialValue = {.floatValues = {25.0f}}}, 387 388 {.config = {.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_DISPLAY_UNITS), 389 .access = VehiclePropertyAccess::READ_WRITE, 390 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 391 .areaConfigs = {VehicleAreaConfig{.areaId = (0)}}}, 392 .initialValue = {.int32Values = {(int)VehicleUnit::FAHRENHEIT}}}, 393 394 {.config = 395 { 396 .prop = toInt(VehicleProperty::NIGHT_MODE), 397 .access = VehiclePropertyAccess::READ, 398 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 399 }, 400 .initialValue = {.int32Values = {0}}}, 401 402 {.config = 403 { 404 .prop = toInt(VehicleProperty::GEAR_SELECTION), 405 .access = VehiclePropertyAccess::READ, 406 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 407 }, 408 .initialValue = {.int32Values = {toInt(VehicleGear::GEAR_PARK)}}}, 409 410 {.config = 411 { 412 .prop = toInt(VehicleProperty::IGNITION_STATE), 413 .access = VehiclePropertyAccess::READ, 414 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 415 }, 416 .initialValue = {.int32Values = {toInt(VehicleIgnitionState::ON)}}}, 417 418 {.config = 419 { 420 .prop = toInt(VehicleProperty::ENGINE_OIL_LEVEL), 421 .access = VehiclePropertyAccess::READ, 422 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 423 }, 424 .initialValue = {.int32Values = {toInt(VehicleOilLevel::NORMAL)}}}, 425 426 {.config = 427 { 428 .prop = toInt(VehicleProperty::ENGINE_OIL_TEMP), 429 .access = VehiclePropertyAccess::READ, 430 .changeMode = VehiclePropertyChangeMode::CONTINUOUS, 431 .minSampleRate = 0.1, // 0.1 Hz, every 10 seconds 432 .maxSampleRate = 10, // 10 Hz, every 100 ms 433 }, 434 .initialValue = {.floatValues = {101.0f}}}, 435 436 { 437 .config = 438 { 439 .prop = kGenerateFakeDataControllingProperty, 440 .access = VehiclePropertyAccess::WRITE, 441 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 442 }, 443 }, 444 445 {.config = {.prop = toInt(VehicleProperty::DOOR_LOCK), 446 .access = VehiclePropertyAccess::READ, 447 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 448 .areaConfigs = {VehicleAreaConfig{.areaId = DOOR_1_LEFT}, 449 VehicleAreaConfig{.areaId = DOOR_1_RIGHT}}}, 450 .initialAreaValues = {{DOOR_1_LEFT, {.int32Values = {1}}}, 451 {DOOR_1_RIGHT, {.int32Values = {1}}}}}, 452 453 {.config = 454 { 455 .prop = WHEEL_TICK, 456 .access = VehiclePropertyAccess::READ, 457 .changeMode = VehiclePropertyChangeMode::CONTINUOUS, 458 .configArray = {ALL_WHEELS, 50000, 50000, 50000, 50000}, 459 .minSampleRate = 1.0f, 460 .maxSampleRate = 10.0f, 461 }, 462 .initialValue = {.int64Values = {0, 100000, 200000, 300000, 400000}}}, 463 464 {.config = {.prop = ABS_ACTIVE, 465 .access = VehiclePropertyAccess::READ, 466 .changeMode = VehiclePropertyChangeMode::ON_CHANGE}, 467 .initialValue = {.int32Values = {0}}}, 468 469 {.config = {.prop = TRACTION_CONTROL_ACTIVE, 470 .access = VehiclePropertyAccess::READ, 471 .changeMode = VehiclePropertyChangeMode::ON_CHANGE}, 472 .initialValue = {.int32Values = {0}}}, 473 474 {.config = {.prop = toInt(VehicleProperty::AP_POWER_STATE_REQ), 475 .access = VehiclePropertyAccess::READ, 476 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 477 .configArray = {3}}, 478 .initialValue = {.int32Values = {toInt(VehicleApPowerStateReq::ON_FULL), 0}}}, 479 480 {.config = {.prop = toInt(VehicleProperty::AP_POWER_STATE_REPORT), 481 .access = VehiclePropertyAccess::WRITE, 482 .changeMode = VehiclePropertyChangeMode::ON_CHANGE}, 483 .initialValue = {.int32Values = {toInt(VehicleApPowerStateReport::BOOT_COMPLETE), 0}}}, 484 485 {.config = {.prop = toInt(VehicleProperty::DISPLAY_BRIGHTNESS), 486 .access = VehiclePropertyAccess::READ_WRITE, 487 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 488 .areaConfigs = {VehicleAreaConfig{.minInt32Value = 0, .maxInt32Value = 100}}}, 489 .initialValue = {.int32Values = {100}}}, 490 491 {.config = {.prop = toInt(VehicleProperty::AP_POWER_BOOTUP_REASON), 492 .access = VehiclePropertyAccess::READ, 493 .changeMode = VehiclePropertyChangeMode::STATIC}, 494 .initialValue = {.int32Values = {toInt(VehicleApPowerBootupReason::USER_POWER_ON)}}}, 495 496 { 497 .config = {.prop = OBD2_LIVE_FRAME, 498 .access = VehiclePropertyAccess::READ, 499 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 500 .configArray = {0, 0}}, 501 }, 502 503 { 504 .config = {.prop = OBD2_FREEZE_FRAME, 505 .access = VehiclePropertyAccess::READ, 506 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 507 .configArray = {0, 0}}, 508 }, 509 510 { 511 .config = {.prop = OBD2_FREEZE_FRAME_INFO, 512 .access = VehiclePropertyAccess::READ, 513 .changeMode = VehiclePropertyChangeMode::ON_CHANGE}, 514 }, 515 516 { 517 .config = {.prop = OBD2_FREEZE_FRAME_CLEAR, 518 .access = VehiclePropertyAccess::WRITE, 519 .changeMode = VehiclePropertyChangeMode::ON_CHANGE, 520 .configArray = {1}}, 521 }, 522 523 {.config = {.prop = VEHICLE_MAP_SERVICE, 524 .access = VehiclePropertyAccess::READ_WRITE, 525 .changeMode = VehiclePropertyChangeMode::ON_CHANGE}}, 526 }; 527 528 } // impl 529 530 } // namespace V2_0 531 } // namespace vehicle 532 } // namespace automotive 533 } // namespace hardware 534 } // namespace android 535 536 #endif // android_hardware_automotive_vehicle_V2_0_impl_DefaultConfig_H_ 537