1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_VEHICLE_INTERFACE_H 18 #define ANDROID_VEHICLE_INTERFACE_H 19 20 #include <stdint.h> 21 #include <sys/cdefs.h> 22 #include <sys/types.h> 23 #include <math.h> 24 #include <errno.h> 25 26 #include <hardware/hardware.h> 27 #include <cutils/native_handle.h> 28 29 __BEGIN_DECLS 30 31 /*****************************************************************************/ 32 33 #define VEHICLE_HEADER_VERSION 1 34 #define VEHICLE_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(1, 0) 35 #define VEHICLE_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION_2(1, 0, VEHICLE_HEADER_VERSION) 36 37 /** 38 * Vehicle HAL to provide interfaces to various Car related sensors. The HAL is 39 * designed in a property, value maping where each property has a value which 40 * can be "get", "set" and "(un)subscribed" to. Subscribing will require the 41 * user of this HAL to provide parameters such as sampling rate. 42 */ 43 44 45 /* 46 * The id of this module 47 */ 48 #define VEHICLE_HARDWARE_MODULE_ID "vehicle" 49 50 /** 51 * Name of the vehicle device to open 52 */ 53 #define VEHICLE_HARDWARE_DEVICE "vehicle_hw_device" 54 55 /** 56 * Each vehicle property is defined with various annotations to specify the type of information. 57 * Annotations will be used by scripts to run some type check or generate some boiler-plate codes. 58 * Also the annotations are the specification for each property, and each HAL implementation should 59 * follow what is specified as annotations. 60 * Here is the list of annotations with explanation on what it does: 61 * @value_type: Type of data for this property. One of the value from vehicle_value_type should be 62 * set here. 63 * @change_mode: How this property changes. Value set is from vehicle_prop_change_mode. Some 64 * properties can allow either on change or continuous mode and it is up to HAL 65 * implementation to choose which mode to use. 66 * @access: Define how this property can be accessed. read only, write only or R/W from 67 * vehicle_prop_access 68 * @data_member: Name of member from vehicle_value union to access this data. 69 * @data_enum: enum type that should be used for the data. 70 * @unit: Unit of data. Should be from vehicle_unit_type. 71 * @config_flags: Usage of config_flags in vehicle_prop_config 72 * @config_array: Usage of config_array in vehicle_prop_config. When this is specified, 73 * @config_flags will not be used. 74 * @config_string: Explains the usage of config_string in vehicle_prop_config. Property with 75 * this annotation is expected to have additional information in config_string 76 * for that property to work. 77 * @zone_type type of zoned used. defined for zoned property 78 * @range_start, @range_end : define range of specific property values. 79 * @allow_out_of_range_value : This property allows out of range value to deliver additional 80 * information. Check VEHICLE_*_OUT_OF_RANGE_* for applicable values. 81 */ 82 //===== Vehicle Information ==== 83 84 /** 85 * Invalid property value used for argument where invalid property gives different result. 86 * @range_start 87 */ 88 #define VEHICLE_PROPERTY_INVALID (0x0) 89 90 /** 91 * VIN of vehicle 92 * @value_type VEHICLE_VALUE_TYPE_STRING 93 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 94 * @access VEHICLE_PROP_ACCESS_READ 95 * @data_member info_vin 96 */ 97 #define VEHICLE_PROPERTY_INFO_VIN (0x00000100) 98 99 /** 100 * Maker name of vehicle 101 * @value_type VEHICLE_VALUE_TYPE_STRING 102 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 103 * @access VEHICLE_PROP_ACCESS_READ 104 * @data_member info_make 105 */ 106 #define VEHICLE_PROPERTY_INFO_MAKE (0x00000101) 107 108 /** 109 * Model of vehicle 110 * @value_type VEHICLE_VALUE_TYPE_STRING 111 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 112 * @access VEHICLE_PROP_ACCESS_READ 113 * @data_member info_model 114 */ 115 #define VEHICLE_PROPERTY_INFO_MODEL (0x00000102) 116 117 /** 118 * Model year of vehicle. 119 * @value_type VEHICLE_VALUE_TYPE_INT32 120 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 121 * @access VEHICLE_PROP_ACCESS_READ 122 * @data_member info_model_year 123 * @unit VEHICLE_UNIT_TYPE_YEAR 124 */ 125 #define VEHICLE_PROPERTY_INFO_MODEL_YEAR (0x00000103) 126 127 /** 128 * Fuel capacity of the vehicle 129 * @value_type VEHICLE_VALUE_TYPE_FLOAT 130 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 131 * @access VEHICLE_PROP_ACCESS_READ 132 * @data_member info_fuel_capacity 133 * @unit VEHICLE_UNIT_TYPE_VEHICLE_UNIT_TYPE_MILLILITER 134 */ 135 #define VEHICLE_PROPERTY_INFO_FUEL_CAPACITY (0x00000104) 136 137 138 //==== Vehicle Performance Sensors ==== 139 140 /** 141 * Current odometer value of the vehicle 142 * @value_type VEHICLE_VALUE_TYPE_FLOAT 143 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 144 * @access VEHICLE_PROP_ACCESS_READ 145 * @data_member odometer 146 * @unit VEHICLE_UNIT_TYPE_KILOMETER 147 */ 148 #define VEHICLE_PROPERTY_PERF_ODOMETER (0x00000204) 149 150 /** 151 * Speed of the vehicle 152 * @value_type VEHICLE_VALUE_TYPE_FLOAT 153 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 154 * @access VEHICLE_PROP_ACCESS_READ 155 * @data_member vehicle_speed 156 * @unit VEHICLE_UNIT_TYPE_METER_PER_SEC 157 */ 158 #define VEHICLE_PROPERTY_PERF_VEHICLE_SPEED (0x00000207) 159 160 161 //==== Engine Sensors ==== 162 163 /** 164 * Temperature of engine coolant 165 * @value_type VEHICLE_VALUE_TYPE_FLOAT 166 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 167 * @access VEHICLE_PROP_ACCESS_READ 168 * @data_member engine_coolant_temperature 169 * @unit VEHICLE_UNIT_TYPE_CELCIUS 170 */ 171 #define VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP (0x00000301) 172 173 /** 174 * Temperature of engine oil 175 * @value_type VEHICLE_VALUE_TYPE_FLOAT 176 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 177 * @access VEHICLE_PROP_ACCESS_READ 178 * @data_member engine_oil_temperature 179 * @unit VEHICLE_UNIT_TYPE_CELCIUS 180 */ 181 #define VEHICLE_PROPERTY_ENGINE_OIL_TEMP (0x00000304) 182 /** 183 * Engine rpm 184 * @value_type VEHICLE_VALUE_TYPE_FLOAT 185 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 186 * @access VEHICLE_PROP_ACCESS_READ 187 * @data_member engine_rpm 188 * @unit VEHICLE_UNIT_TYPE_RPM 189 */ 190 #define VEHICLE_PROPERTY_ENGINE_RPM (0x00000305) 191 192 //==== Event Sensors ==== 193 194 /** 195 * Currently selected gear 196 * @value_type VEHICLE_VALUE_TYPE_INT32 197 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 198 * @access VEHICLE_PROP_ACCESS_READ 199 * @data_member gear_selection 200 * @data_enum vehicle_gear 201 */ 202 #define VEHICLE_PROPERTY_GEAR_SELECTION (0x00000400) 203 204 /** 205 * Current gear. In non-manual case, selected gear does not necessarily match the current gear 206 * @value_type VEHICLE_VALUE_TYPE_INT32 207 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 208 * @access VEHICLE_PROP_ACCESS_READ 209 * @data_member gear_current_gear 210 * @data_enum vehicle_gear 211 */ 212 #define VEHICLE_PROPERTY_CURRENT_GEAR (0x00000401) 213 214 /** 215 * Parking brake state. 216 * @value_type VEHICLE_VALUE_TYPE_BOOLEAN 217 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 218 * @access VEHICLE_PROP_ACCESS_READ 219 * @data_member parking_brake 220 * @data_enum vehicle_boolean 221 */ 222 #define VEHICLE_PROPERTY_PARKING_BRAKE_ON (0x00000402) 223 224 /** 225 * Driving status policy. 226 * @value_type VEHICLE_VALUE_TYPE_INT32 227 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 228 * @access VEHICLE_PROP_ACCESS_READ 229 * @data_member driving_status 230 * @data_enum vehicle_driving_status 231 */ 232 #define VEHICLE_PROPERTY_DRIVING_STATUS (0x00000404) 233 234 /** 235 * Warning for fuel low level. 236 * @value_type VEHICLE_VALUE_TYPE_BOOLEAN 237 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 238 * @access VEHICLE_PROP_ACCESS_READ 239 * @data_member is_fuel_level_low 240 * @data_enum vehicle_boolean 241 */ 242 #define VEHICLE_PROPERTY_FUEL_LEVEL_LOW (0x00000405) 243 244 /** 245 * Night mode or not. 246 * @value_type VEHICLE_VALUE_TYPE_BOOLEAN 247 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 248 * @access VEHICLE_PROP_ACCESS_READ 249 * @data_member night_mode 250 * @data_enum vehicle_boolean 251 */ 252 #define VEHICLE_PROPERTY_NIGHT_MODE (0x00000407) 253 254 255 256 //==== HVAC Properties ==== 257 258 /** 259 * Fan speed setting 260 * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32 261 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 262 * @access VEHICLE_PROP_ACCESS_READ_WRITE 263 * @data_member hvac.fan_speed 264 * @zone_type VEHICLE_ZONE 265 * @data_enum TODO 266 * @allow_out_of_range_value : OFF 267 */ 268 #define VEHICLE_PROPERTY_HVAC_FAN_SPEED (0x00000500) 269 270 /** 271 * Fan direction setting 272 * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32 273 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 274 * @access VEHICLE_PROP_ACCESS_READ_WRITE 275 * @data_member hvac.fan_direction 276 * @zone_type VEHICLE_ZONE 277 * @data_enum TODO 278 * @allow_out_of_range_value : OFF 279 */ 280 #define VEHICLE_PROPERTY_HVAC_FAN_DIRECTION (0x00000501) 281 282 /* 283 * Bit flags for fan direction 284 */ 285 enum vehicle_hvac_fan_direction { 286 VEHICLE_HVAC_FAN_DIRECTION_FACE = 0x1, 287 VEHICLE_HVAC_FAN_DIRECTION_FLOOR = 0x2, 288 VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR = 0x3, 289 VEHICLE_HVAC_FAN_DIRECTION_DEFROST = 0x4, 290 VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR = 0x5 291 }; 292 293 /** 294 * HVAC current temperature. 295 * @value_type VEHICLE_VALUE_TYPE_ZONED_FLOAT 296 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 297 * @access VEHICLE_PROP_ACCESS_READ_WRITE 298 * @zone_type VEHICLE_ZONE 299 * @data_member hvac.temperature_current 300 */ 301 #define VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT (0x00000502) 302 303 /** 304 * HVAC, target temperature set. 305 * @value_type VEHICLE_VALUE_TYPE_ZONED_FLOAT 306 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 307 * @access VEHICLE_PROP_ACCESS_READ_WRITE 308 * @zone_type VEHICLE_ZONE 309 * @data_member hvac.temperature_set 310 * @allow_out_of_range_value : MIN / MAX / OFF 311 */ 312 #define VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET (0x00000503) 313 314 /** 315 * On/off defrost 316 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 317 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 318 * @access VEHICLE_PROP_ACCESS_READ_WRITE 319 * @zone_type VEHICLE_WINDOW 320 * @data_member hvac.defrost_on 321 */ 322 #define VEHICLE_PROPERTY_HVAC_DEFROSTER (0x00000504) 323 324 /** 325 * On/off AC 326 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 327 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 328 * @access VEHICLE_PROP_ACCESS_READ_WRITE 329 * @config_flags Supported zones 330 * @zone_type VEHICLE_ZONE 331 * @data_member hvac.ac_on 332 */ 333 #define VEHICLE_PROPERTY_HVAC_AC_ON (0x00000505) 334 335 /** 336 * On/off max AC 337 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 338 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 339 * @access VEHICLE_PROP_ACCESS_READ_WRITE 340 * @zone_type VEHICLE_ZONE 341 * @data_member hvac.max_ac_on 342 */ 343 #define VEHICLE_PROPERTY_HVAC_MAX_AC_ON (0x00000506) 344 345 /** 346 * On/off max defrost 347 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 348 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 349 * @access VEHICLE_PROP_ACCESS_READ_WRITE 350 * @zone_type VEHICLE_ZONE 351 * @data_member hvac.max_defrost_on 352 */ 353 #define VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON (0x00000507) 354 355 /** 356 * On/off re-circulation 357 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 358 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 359 * @access VEHICLE_PROP_ACCESS_READ_WRITE 360 * @zone_type VEHICLE_ZONE 361 * @data_member hvac.max_recirc_on 362 */ 363 #define VEHICLE_PROPERTY_HVAC_RECIRC_ON (0x00000508) 364 365 /** 366 * On/off dual. This will be defined per each row. 367 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 368 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 369 * @access VEHICLE_PROP_ACCESS_READ_WRITE 370 * @zone_type VEHICLE_ZONE 371 * @data_member hvac.dual_on 372 */ 373 #define VEHICLE_PROPERTY_HVAC_DUAL_ON (0x00000509) 374 375 /** 376 * Represents power state for HVAC. Some HVAC properties will require matching power to be turned on 377 * to get out of OFF state. For non-zoned HVAC properties, VEHICLE_ALL_ZONE corresponds to 378 * global power state. 379 * 380 * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN 381 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 382 * @access VEHICLE_PROP_ACCESS_READ_WRITE 383 * @config_string list of HVAC properties whose power is controlled by this property. Format is 384 * hexa-decimal number (0x...) separated by comma like "0x500,0x503". All zones 385 * defined in these affected properties should be available in the property. 386 * @zone_type VEHICLE_ZONE 387 * @data_member hvac.power_on 388 */ 389 #define VEHICLE_PROPERTY_HVAC_POWER_ON (0x00000510) 390 391 /** 392 * Outside temperature 393 * @value_type VEHICLE_VALUE_TYPE_FLOAT 394 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 395 * @access VEHICLE_PROP_ACCESS_READ 396 * @data_member outside_temperature 397 * @unit VEHICLE_UNIT_TYPE_CELCIUS 398 */ 399 400 #define VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE (0x00000703) 401 402 403 /** 404 * Cabin temperature 405 * @value_type VEHICLE_VALUE_TYPE_FLOAT 406 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS 407 * @access VEHICLE_PROP_ACCESS_READ 408 * @data_member cabin_temperature 409 * @unit VEHICLE_UNIT_TYPE_CELCIUS 410 */ 411 #define VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE (0x00000704) 412 413 414 /* 415 * Radio features. 416 */ 417 /** 418 * Radio presets stored on the Car radio module. The data type used is int32 419 * array with the following fields: 420 * <ul> 421 * <li> int32_array[0]: Preset number </li> 422 * <li> int32_array[1]: Band type (see #RADIO_BAND_FM in 423 * system/core/include/system/radio.h). 424 * <li> int32_array[2]: Channel number </li> 425 * <li> int32_array[3]: Sub channel number </li> 426 * </ul> 427 * 428 * NOTE: When getting a current preset config ONLY set preset number (i.e. 429 * int32_array[0]). For setting a preset other fields are required. 430 * 431 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4 432 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 433 * @access VEHICLE_PROP_ACCESS_READ_WRITE 434 * @config_flags Number of presets supported 435 * @data_member int32_array 436 */ 437 #define VEHICLE_PROPERTY_RADIO_PRESET (0x0000801) 438 439 /** 440 * Constants relevant to radio. 441 */ 442 enum vehicle_radio_consts { 443 /** Minimum value for the radio preset */ 444 VEHICLE_RADIO_PRESET_MIN_VALUE = 1, 445 }; 446 447 /** 448 * Represents audio focus state of Android side. Note that car's audio module will own audio 449 * focus and grant audio focus to Android side when requested by Android side. The focus has both 450 * per stream characteristics and global characteristics. 451 * 452 * Focus request (get of this property) will take the following form in int32_vec4: 453 * int32_array[0]: vehicle_audio_focus_request type 454 * int32_array[1]: bit flags of streams requested by this focus request. There can be up to 455 * 32 streams. 456 * int32_array[2]: External focus state flags. For request, only flag like 457 * VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG or 458 * VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG can be used. 459 * VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG is for case like radio where android 460 * side app still needs to hold focus but playback is done outside Android. 461 * VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG is for muting media channel 462 * including radio. VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG can be set even 463 * if android side releases focus (request type REQUEST_RELEASE). In that case, 464 * audio module should maintain mute state until user's explicit action to 465 * play some media. 466 * int32_array[3]: Currently active audio contexts. Use combination of flags from 467 * vehicle_audio_context_flag. 468 * This can be used as a hint to adjust audio policy or other policy decision. 469 * Note that there can be multiple context active at the same time. And android 470 * can send the same focus request type gain due to change in audio contexts. 471 * Note that each focus request can request multiple streams that is expected to be used for 472 * the current request. But focus request itself is global behavior as GAIN or GAIN_TRANSIENT 473 * expects all sounds played by car's audio module to stop. Note that stream already allocated to 474 * android before this focus request should not be affected by focus request. 475 * 476 * Focus response (set and subscription callback for this property) will take the following form: 477 * int32_array[0]: vehicle_audio_focus_state type 478 * int32_array[1]: bit flags of streams allowed. 479 * int32_array[2]: External focus state: bit flags of currently active audio focus in car 480 * side (outside Android). Active audio focus does not necessarily mean currently 481 * playing, but represents the state of having focus or waiting for focus 482 * (pause state). 483 * One or combination of flags from vehicle_audio_ext_focus_flag. 484 * 0 means no active audio focus holder outside Android. 485 * The state will have following values for each vehicle_audio_focus_state_type: 486 * GAIN: 0 or VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY when radio is active in 487 * Android side. 488 * GAIN_TRANSIENT: 0. Can be VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT or 489 * VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT if android side has requested 490 * GAIN_TRANSIENT_MAY_DUCK and car side is ducking. 491 * LOSS: 0 when no focus is audio is active in car side. 492 * VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT when car side is playing something 493 * permanent. 494 * LOSS_TRANSIENT: always should be VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT 495 * int32_array[3]: should be zero. 496 * 497 * If car does not support VEHICLE_PROPERTY_AUDIO_FOCUS, focus is assumed to be granted always. 498 * 499 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4 500 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 501 * @access VEHICLE_PROP_ACCESS_READ_WRITE 502 * @data_member int32_array 503 */ 504 #define VEHICLE_PROPERTY_AUDIO_FOCUS (0x00000900) 505 506 enum vehicle_audio_focus_request { 507 VEHICLE_AUDIO_FOCUS_REQUEST_GAIN = 0x1, 508 VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT = 0x2, 509 VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK = 0x3, 510 /** 511 * This is for the case where android side plays sound like UI feedback 512 * and car side does not need to duck existing playback as long as 513 * requested stream is available. 514 */ 515 VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK = 0x4, 516 VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE = 0x5, 517 }; 518 519 enum vehicle_audio_focus_state { 520 /** 521 * Android side has permanent focus and can play allowed streams. 522 */ 523 VEHICLE_AUDIO_FOCUS_STATE_GAIN = 0x1, 524 /** 525 * Android side has transient focus and can play allowed streams. 526 */ 527 VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT = 0x2, 528 /** 529 * Car audio module is playing guidance kind of sound outside Android. Android side can 530 * still play through allowed streams with ducking. 531 */ 532 VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK = 0x3, 533 /** 534 * Car audio module is playing transient sound outside Android. Android side should stop 535 * playing any sounds. 536 */ 537 VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT = 0x4, 538 /** 539 * Android side has lost focus and cannot play any sound. 540 */ 541 VEHICLE_AUDIO_FOCUS_STATE_LOSS = 0x5, 542 /** 543 * car audio module is playing safety critical sound, and Android side cannot request focus 544 * until the current state is finished. car audio module should restore it to the previous 545 * state when it can allow Android to play. 546 */ 547 VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE = 0x6, 548 }; 549 550 /** 551 * Flags to represent multiple streams by combining these. 552 */ 553 enum vehicle_audio_stream_flag { 554 VEHICLE_AUDIO_STREAM_STREAM0_FLAG = (0x1<<0), 555 VEHICLE_AUDIO_STREAM_STREAM1_FLAG = (0x1<<1), 556 VEHICLE_AUDIO_STREAM_STREAM2_FLAG = (0x1<<2), 557 }; 558 559 /** 560 * Represents stream number (always 0 to N -1 where N is max number of streams). 561 * Can be used for audio related property expecting one stream. 562 */ 563 enum vehicle_audio_stream { 564 VEHICLE_AUDIO_STREAM0 = 0, 565 VEHICLE_AUDIO_STREAM1 = 1, 566 }; 567 568 /** 569 * Flag to represent external focus state (outside Android). 570 */ 571 enum vehicle_audio_ext_focus_flag { 572 /** 573 * No external focus holder. 574 */ 575 VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG = 0x0, 576 /** 577 * Car side (outside Android) has component holding GAIN kind of focus state. 578 */ 579 VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG = 0x1, 580 /** 581 * Car side (outside Android) has component holding GAIN_TRANSIENT kind of focus state. 582 */ 583 VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG = 0x2, 584 /** 585 * Car side is expected to play something while focus is held by Android side. One example 586 * can be radio attached in car side. But Android's radio app still should have focus, 587 * and Android side should be in GAIN state, but media stream will not be allocated to Android 588 * side and car side can play radio any time while this flag is active. 589 */ 590 VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG = 0x4, 591 /** 592 * Car side should mute any media including radio. This can be used with any focus request 593 * including GAIN* and RELEASE. 594 */ 595 VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG = 0x8, 596 }; 597 598 /** 599 * Index in int32_array for VEHICLE_PROPERTY_AUDIO_FOCUS property. 600 */ 601 enum vehicle_audio_focus_index { 602 VEHICLE_AUDIO_FOCUS_INDEX_FOCUS = 0, 603 VEHICLE_AUDIO_FOCUS_INDEX_STREAMS = 1, 604 VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE = 2, 605 VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS = 3, 606 }; 607 608 /** 609 * Flags to tell the current audio context. 610 */ 611 enum vehicle_audio_context_flag { 612 /** Music playback is currently active. */ 613 VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG = 0x1, 614 /** Navigation is currently running. */ 615 VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG = 0x2, 616 /** Voice command session is currently running. */ 617 VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG = 0x4, 618 /** Voice call is currently active. */ 619 VEHICLE_AUDIO_CONTEXT_CALL_FLAG = 0x8, 620 /** Alarm is active. This may be only used in VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY. */ 621 VEHICLE_AUDIO_CONTEXT_ALARM_FLAG = 0x10, 622 /** 623 * Notification sound is active. This may be only used in VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY. 624 */ 625 VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG = 0x20, 626 /** 627 * Context unknown. Only used for VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY to represent default 628 * stream for unknown contents. 629 */ 630 VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG = 0x40, 631 /** Safety alert / warning is played. */ 632 VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG = 0x80, 633 /** CD / DVD kind of audio is played */ 634 VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG = 0x100, 635 /** Aux audio input is played */ 636 VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG = 0x200, 637 /** system sound like UI feedback */ 638 VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG = 0x400, 639 /** Radio is played */ 640 VEHICLE_AUDIO_CONTEXT_RADIO_FLAG = 0x800, 641 }; 642 643 /** 644 * Property to control audio volume of each audio context. 645 * 646 * Data type looks like: 647 * int32_array[0] : stream context as defined in vehicle_audio_context_flag. 648 * int32_array[1] : volume level, valid range is 0 to int32_max_value defined in config. 649 * 0 will be mute state. int32_min_value in config should be always 0. 650 * int32_array[2] : One of vehicle_audio_volume_state. 651 * 652 * This property requires per stream based get. HAL implementation should check stream number 653 * in get call to return the right volume. 654 * 655 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC3 656 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 657 * @access VEHICLE_PROP_ACCESS_READ_WRITE 658 * @config_flags all audio contexts supported. 659 * @data_member int32_array 660 */ 661 #define VEHICLE_PROPERTY_AUDIO_VOLUME (0x00000901) 662 663 /** 664 * enum to represent audio volume state. 665 */ 666 enum vehicle_audio_volume_state { 667 VEHICLE_AUDIO_VOLUME_STATE_OK = 0, 668 /** 669 * Audio volume has reached volume limit set in VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT 670 * and user's request to increase volume further is not allowed. 671 */ 672 VEHICLE_AUDIO_VOLUME_STATE_LIMIT_REACHED = 1, 673 }; 674 675 /** 676 * Index in int32_array for VEHICLE_PROPERTY_AUDIO_VOLUME property. 677 */ 678 enum vehicle_audio_volume_index { 679 VEHICLE_AUDIO_VOLUME_INDEX_STREAM = 0, 680 VEHICLE_AUDIO_VOLUME_INDEX_VOLUME = 1, 681 VEHICLE_AUDIO_VOLUME_INDEX_STATE = 2, 682 }; 683 684 /** 685 * Property for handling volume limit set by user. This limits maximum volume that can be set 686 * per each context. 687 * int32_array[0] : stream context as defined in vehicle_audio_context_flag. 688 * int32_array[1] : maximum volume set to the stream. If there is no restriction, this value 689 * will be bigger than VEHICLE_PROPERTY_AUDIO_VOLUME's max value. 690 * 691 * If car does not support this feature, this property should not be populated by HAL. 692 * This property requires per stream based get. HAL implementation should check stream number 693 * in get call to return the right volume. 694 * 695 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC2 696 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 697 * @access VEHICLE_PROP_ACCESS_READ_WRITE 698 * @config_flags all audio contexts supported. 699 * @data_member int32_array 700 */ 701 #define VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT (0x00000902) 702 703 /** 704 * Index in int32_array for VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT property. 705 */ 706 enum vehicle_audio_volume_limit_index { 707 VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM = 0, 708 VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME = 1, 709 }; 710 711 /** 712 * Property to share audio routing policy of android side. This property is set at the beginning 713 * to pass audio policy in android side down to vehicle HAL and car audio module. 714 * This can be used as a hint to adjust audio policy or other policy decision. 715 * 716 * int32_array[0] : audio stream where the audio for the application context will be routed 717 * by default. Note that this is the default setting from system, but each app 718 * may still use different audio stream for whatever reason. 719 * int32_array[1] : All audio contexts that will be sent through the physical stream. Flag 720 * is defined in vehicle_audio_context_flag. 721 722 * Setting of this property will be done for all available physical streams based on audio H/W 723 * variant information acquired from VEHICLE_PROPERTY_AUDIO_HW_VARIANT property. 724 * 725 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC2 726 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 727 * @access VEHICLE_PROP_ACCESS_WRITE 728 * @data_member int32_array 729 */ 730 #define VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY (0x00000903) 731 732 /** 733 * Index in int32_array for VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY property. 734 */ 735 enum vehicle_audio_routing_policy_index { 736 VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM = 0, 737 VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS = 1, 738 }; 739 740 /** 741 * Property to return audio H/W variant type used in this car. This allows android side to 742 * support different audio policy based on H/W variant used. Note that other components like 743 * CarService may need overlay update to support additional variants. If this property does not 744 * exist, default audio policy will be used. 745 * 746 * @value_type VEHICLE_VALUE_TYPE_INT32 747 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 748 * @access VEHICLE_PROP_ACCESS_READ 749 * @config_flags Additional info on audio H/W. Should use vehicle_audio_hw_variant_config_flag for 750 * this. 751 * @data_member int32_value 752 */ 753 #define VEHICLE_PROPERTY_AUDIO_HW_VARIANT (0x00000904) 754 755 /** 756 * Flag to be used in vehicle_prop_config.config_flags for VEHICLE_PROPERTY_AUDIO_HW_VARIANT. 757 */ 758 enum vehicle_audio_hw_variant_config_flag { 759 /** 760 * Flag to tell that radio is internal to android and radio should 761 * be treated like other android stream like media. 762 * When this flag is not set or AUDIO_HW_VARIANT does not exist, 763 * radio is treated as external module. This brins some delta in audio focus 764 * handling as well. 765 */ 766 VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG = 0x1, 767 }; 768 769 770 /** 771 * Property to control power state of application processor. 772 * 773 * It is assumed that AP's power state is controller by separate power controller. 774 * 775 * For configuration information, vehicle_prop_config.config_flags can have bit flag combining 776 * values in vehicle_ap_power_state_config_type. 777 * 778 * For get / notification, data type looks like this: 779 * int32_array[0] : vehicle_ap_power_state_type 780 * int32_array[1] : additional parameter relevant for each state. should be 0 if not used. 781 * For set, data type looks like this: 782 * int32_array[0] : vehicle_ap_power_state_set_type 783 * int32_array[1] : additional parameter relevant for each request. should be 0 if not used. 784 * 785 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC2 786 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 787 * @access VEHICLE_PROP_ACCESS_READ_WRITE 788 * @config_flags Additional info on power state. Should use vehicle_ap_power_state_config_flag. 789 * @data_member int32_array 790 */ 791 #define VEHICLE_PROPERTY_AP_POWER_STATE (0x00000A00) 792 793 enum vehicle_ap_power_state_config_flag { 794 /** 795 * AP can enter deep sleep state. If not set, AP will always shutdown from 796 * VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE power state. 797 */ 798 VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG = 0x1, 799 800 /** 801 * The power controller can power on AP from off state after timeout specified in 802 * VEHICLE_AP_POWER_SET_SHUTDOWN_READY message. 803 */ 804 VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG = 0x2, 805 }; 806 807 enum vehicle_ap_power_state { 808 /** vehicle HAL will never publish this state to AP */ 809 VEHICLE_AP_POWER_STATE_OFF = 0, 810 /** vehicle HAL will never publish this state to AP */ 811 VEHICLE_AP_POWER_STATE_DEEP_SLEEP = 1, 812 /** AP is on but display should be off. */ 813 VEHICLE_AP_POWER_STATE_ON_DISP_OFF = 2, 814 /** AP is on with display on. This state allows full user interaction. */ 815 VEHICLE_AP_POWER_STATE_ON_FULL = 3, 816 /** 817 * The power controller has requested AP to shutdown. AP can either enter sleep state or start 818 * full shutdown. AP can also request postponing shutdown by sending 819 * VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE message. The power controller should change power 820 * state to this state to shutdown system. 821 * 822 * int32_array[1] : one of enum_vehicle_ap_power_state_shutdown_param_type 823 */ 824 VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE = 4, 825 }; 826 827 enum vehicle_ap_power_state_shutdown_param { 828 /** AP should shutdown immediately. Postponing is not allowed. */ 829 VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY = 1, 830 /** AP can enter deep sleep instead of shutting down completely. */ 831 VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP = 2, 832 /** AP can only shutdown with postponing allowed. */ 833 VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_ONLY = 3, 834 }; 835 836 enum vehicle_ap_power_set_state { 837 /** 838 * AP has finished boot up, and can start shutdown if requested by power controller. 839 */ 840 VEHICLE_AP_POWER_SET_BOOT_COMPLETE = 0x1, 841 /** 842 * AP is entering deep sleep state. How this state is implemented may vary depending on 843 * each H/W, but AP's power should be kept in this state. 844 */ 845 VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY = 0x2, 846 /** 847 * AP is exiting from deep sleep state, and is in VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE state. 848 * The power controller may change state to other ON states based on the current state. 849 */ 850 VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT = 0x3, 851 /** 852 * int32_array[1]: Time to postpone shutdown in ms. Maximum value can be 5000 ms. 853 * If AP needs more time, it will send another POSTPONE message before 854 * the previous one expires. 855 */ 856 VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE = 0x4, 857 /** 858 * AP is starting shutting down. When system completes shutdown, everything will stop in AP 859 * as kernel will stop all other contexts. It is responsibility of vehicle HAL or lower level 860 * to synchronize that state with external power controller. As an example, some kind of ping 861 * with timeout in power controller can be a solution. 862 * 863 * int32_array[1]: Time to turn on AP in secs. Power controller may turn on AP after specified 864 * time so that AP can run tasks like update. If it is set to 0, there is no 865 * wake up, and power controller may not necessarily support wake-up. 866 * If power controller turns on AP due to timer, it should start with 867 * VEHICLE_AP_POWER_STATE_ON_DISP_OFF state, and after receiving 868 * VEHICLE_AP_POWER_SET_BOOT_COMPLETE, it shall do state transition to 869 * VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE. 870 */ 871 VEHICLE_AP_POWER_SET_SHUTDOWN_START = 0x5, 872 /** 873 * User has requested to turn off headunit's display, which is detected in android side. 874 * The power controller may change the power state to VEHICLE_AP_POWER_STATE_ON_DISP_OFF. 875 */ 876 VEHICLE_AP_POWER_SET_DISPLAY_OFF = 0x6, 877 /** 878 * User has requested to turn on headunit's display, most probably from power key input which 879 * is attached to headunit. The power controller may change the power state to 880 * VEHICLE_AP_POWER_STATE_ON_FULL. 881 */ 882 VEHICLE_AP_POWER_SET_DISPLAY_ON = 0x7, 883 }; 884 885 /** 886 * Property to represent brightness of the display. Some cars have single control for 887 * the brightness of all displays and this property is to share change in that control. 888 * 889 * If this is writable, android side can set this value when user changes display brightness 890 * from Settings. If this is read only, user may still change display brightness from Settings, 891 * but that will not be reflected to other displays. 892 * 893 * @value_type VEHICLE_VALUE_TYPE_INT32 894 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 895 * @access VEHICLE_PROP_ACCESS_READ|VEHICLE_PROP_ACCESS_READ_WRITE 896 * @data_member int32 897 */ 898 #define VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS (0x00000A01) 899 900 901 /** 902 * Index in int32_array for VEHICLE_PROPERTY_AP_POWER_STATE property. 903 */ 904 enum vehicle_ap_power_state_index { 905 VEHICLE_AP_POWER_STATE_INDEX_STATE = 0, 906 VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL = 1, 907 }; 908 909 /** 910 * Property to report bootup reason for the current power on. This is a static property that will 911 * not change for the whole duration until power off. For example, even if user presses power on 912 * button after automatic power on with door unlock, bootup reason should stay with 913 * VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK. 914 * 915 * int32_value should be vehicle_ap_power_bootup_reason. 916 * 917 * @value_type VEHICLE_VALUE_TYPE_INT32 918 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC 919 * @access VEHICLE_PROP_ACCESS_READ 920 * @data_member int32_value 921 */ 922 #define VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON (0x00000A02) 923 924 /** 925 * Enum to represent bootup reason. 926 */ 927 enum vehicle_ap_power_bootup_reason { 928 /** 929 * Power on due to user's pressing of power key or rotating of ignition switch. 930 */ 931 VEHICLE_AP_POWER_BOOTUP_REASON_USER_POWER_ON = 0, 932 /** 933 * Automatic power on triggered by door unlock or any other kind of automatic user detection. 934 */ 935 VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK = 1, 936 /** 937 * Automatic power on triggered by timer. This only happens when AP has asked wake-up after 938 * certain time through time specified in VEHICLE_AP_POWER_SET_SHUTDOWN_START. 939 */ 940 VEHICLE_AP_POWER_BOOTUP_REASON_TIMER = 2, 941 }; 942 943 944 /** 945 * Property to feed H/W input events to android 946 * 947 * int32_array[0] : action defined by vehicle_hw_key_input_action 948 * int32_array[1] : key code, should use standard android key code 949 * int32_array[2] : target display defined in vehicle_display. Events not tied 950 * to specific display should be sent to DISPLAY_MAIN. 951 * int32_array[3] : reserved for now. should be zero 952 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4 953 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 954 * @access VEHICLE_PROP_ACCESS_READ 955 * @config_flags 956 * @data_member int32_array 957 */ 958 #define VEHICLE_PROPERTY_HW_KEY_INPUT (0x00000A10) 959 960 enum vehicle_hw_key_input_action { 961 /** Key down */ 962 VEHICLE_HW_KEY_INPUT_ACTION_DOWN = 0, 963 /** Key up */ 964 VEHICLE_HW_KEY_INPUT_ACTION_UP = 1, 965 }; 966 967 enum vehicle_display { 968 /** center console */ 969 VEHICLE_DISPLAY_MAIN = 0, 970 VEHICLE_DISPLAY_INSTRUMENT_CLUSTER = 1, 971 }; 972 973 /** 974 * Property to define instrument cluster information. 975 * For CLUSTER_TYPE_EXTERNAL_DISPLAY: 976 * READ: 977 * int32_array[0] : The current screen mode index. Screen mode is defined 978 * as a configuration in car service and represents which 979 * area of screen is renderable. 980 * int32_array[1] : Android can render to instrument cluster (=1) or not(=0). When this is 0, 981 * instrument cluster may be rendering some information in the area 982 * allocated for android and android side rendering is invisible. * 983 * int32_array[2..3] : should be zero 984 * WRITE from android: 985 * int32_array[0] : Preferred mode for android side. Depending on the app rendering to instrument 986 * cluster, preferred mode can change. Instrument cluster still needs to send 987 * event with new mode to trigger actual mode change. 988 * int32_array[1] : The current app context relevant for instrument cluster. Use the same flag 989 * with vehicle_audio_context_flag but this context represents active apps, not 990 * active audio. Instrument cluster side may change mode depending on the 991 * currently active contexts. 992 * int32_array[2..3] : should be zero 993 * When system boots up, Android side will write {0, 0, 0, 0} when it is ready to render to 994 * instrument cluster. Before this message, rendering from android should not be visible in the 995 * cluster. 996 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4 997 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 998 * @access VEHICLE_PROP_ACCESS_READ_WRITE 999 * @config_array 0:vehicle_instument_cluster_type 1:hw type 1000 * @data_member int32_array 1001 */ 1002 #define VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO (0x00000A20) 1003 1004 /** 1005 * Represents instrument cluster type available in system 1006 */ 1007 enum vehicle_instument_cluster_type { 1008 /** Android has no access to instument cluster */ 1009 VEHICLE_INSTRUMENT_CLUSTER_TYPE_NONE = 0, 1010 /** 1011 * Instrument cluster can communicate through vehicle hal with additional 1012 * properties to exchange meta-data 1013 */ 1014 VEHICLE_INSTRUMENT_CLUSTER_TYPE_HAL_INTERFACE = 1, 1015 /** 1016 * Instrument cluster is external display where android can render contents 1017 */ 1018 VEHICLE_INSTRUMENT_CLUSTER_TYPE_EXTERNAL_DISPLAY = 2, 1019 }; 1020 1021 /** 1022 * H/W specific, non-standard property can be added as necessary. Such property should use 1023 * property number in range of [VEHICLE_PROPERTY_CUSTOM_START, VEHICLE_PROPERTY_CUSTOM_END]. 1024 * Definition of property in this range is completely up to each HAL implementation. 1025 * For such property, it is recommended to fill vehicle_prop_config.config_string with some 1026 * additional information to help debugging. For example, company XYZ's custom extension may 1027 * include config_string of "com.XYZ.some_further_details". 1028 * @range_start 1029 */ 1030 #define VEHICLE_PROPERTY_CUSTOM_START (0x70000000) 1031 /** @range_end */ 1032 #define VEHICLE_PROPERTY_CUSTOM_END (0x73ffffff) 1033 1034 /** 1035 * Property range allocated for system's internal usage like testing. HAL should never declare 1036 * property in this range. 1037 * @range_start 1038 */ 1039 #define VEHICLE_PROPERTY_INTERNAL_START (0x74000000) 1040 /** 1041 * @range_end 1042 */ 1043 #define VEHICLE_PROPERTY_INTERNAL_END (0x74ffffff) 1044 1045 /** 1046 * Value types for various properties. 1047 */ 1048 enum vehicle_value_type { 1049 VEHICLE_VALUE_TYPE_SHOUD_NOT_USE = 0x00, // value_type should never set to 0. 1050 VEHICLE_VALUE_TYPE_STRING = 0x01, 1051 VEHICLE_VALUE_TYPE_BYTES = 0x02, 1052 VEHICLE_VALUE_TYPE_BOOLEAN = 0x03, 1053 VEHICLE_VALUE_TYPE_ZONED_BOOLEAN = 0x04, 1054 VEHICLE_VALUE_TYPE_INT64 = 0x05, 1055 VEHICLE_VALUE_TYPE_FLOAT = 0x10, 1056 VEHICLE_VALUE_TYPE_FLOAT_VEC2 = 0x11, 1057 VEHICLE_VALUE_TYPE_FLOAT_VEC3 = 0x12, 1058 VEHICLE_VALUE_TYPE_FLOAT_VEC4 = 0x13, 1059 VEHICLE_VALUE_TYPE_INT32 = 0x20, 1060 VEHICLE_VALUE_TYPE_INT32_VEC2 = 0x21, 1061 VEHICLE_VALUE_TYPE_INT32_VEC3 = 0x22, 1062 VEHICLE_VALUE_TYPE_INT32_VEC4 = 0x23, 1063 VEHICLE_VALUE_TYPE_ZONED_FLOAT = 0x30, 1064 VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2 = 0x31, 1065 VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3 = 0x32, 1066 VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4 = 0x33, 1067 VEHICLE_VALUE_TYPE_ZONED_INT32 = 0x40, 1068 VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2 = 0x41, 1069 VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3 = 0x42, 1070 VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4 = 0x43, 1071 }; 1072 1073 /** 1074 * Units used for int or float type with no attached enum types. 1075 */ 1076 enum vehicle_unit_type { 1077 VEHICLE_UNIT_TYPE_SHOULD_NOT_USE = 0x00000000, 1078 // speed related items 1079 VEHICLE_UNIT_TYPE_METER_PER_SEC = 0x00000001, 1080 VEHICLE_UNIT_TYPE_RPM = 0x00000002, 1081 VEHICLE_UNIT_TYPE_HZ = 0x00000003, 1082 // kind of ratio 1083 VEHICLE_UNIT_TYPE_PERCENTILE = 0x00000010, 1084 // length 1085 VEHICLE_UNIT_TYPE_MILLIMETER = 0x00000020, 1086 VEHICLE_UNIT_TYPE_METER = 0x00000021, 1087 VEHICLE_UNIT_TYPE_KILOMETER = 0x00000023, 1088 // temperature 1089 VEHICLE_UNIT_TYPE_CELCIUS = 0x00000030, 1090 // volume 1091 VEHICLE_UNIT_TYPE_MILLILITER = 0x00000040, 1092 // time 1093 VEHICLE_UNIT_TYPE_NANO_SECS = 0x00000050, 1094 VEHICLE_UNOT_TYPE_SECS = 0x00000053, 1095 VEHICLE_UNIT_TYPE_YEAR = 0x00000059, 1096 }; 1097 1098 /** 1099 * This describes how value of property can change. 1100 */ 1101 enum vehicle_prop_change_mode { 1102 /** 1103 * Property of this type will *never* change. This property will not support subscription, but 1104 * will support get 1105 */ 1106 VEHICLE_PROP_CHANGE_MODE_STATIC = 0x00, 1107 /** 1108 * Property of this type will be reported when there is a change. get should return the 1109 * current value. 1110 */ 1111 VEHICLE_PROP_CHANGE_MODE_ON_CHANGE = 0x01, 1112 /** 1113 * Property of this type change continuously and requires fixed rate of sampling to retrieve 1114 * the data. 1115 */ 1116 VEHICLE_PROP_CHANGE_MODE_CONTINUOUS = 0x02, 1117 }; 1118 1119 /** 1120 * Property config defines the capabilities of it. User of the API 1121 * should first get the property config to understand the output from get() 1122 * commands and also to ensure that set() or events commands are in sync with 1123 * the expected output. 1124 */ 1125 enum vehicle_prop_access { 1126 VEHICLE_PROP_ACCESS_READ = 0x01, 1127 VEHICLE_PROP_ACCESS_WRITE = 0x02, 1128 VEHICLE_PROP_ACCESS_READ_WRITE = 0x03 1129 }; 1130 1131 /** 1132 * These permissions define how the OEMs want to distribute their information and security they 1133 * want to apply. On top of these restrictions, android will have additional 1134 * 'app-level' permissions that the apps will need to ask the user before the apps have the 1135 * information. 1136 * This information should be kept in vehicle_prop_config.permission_model. 1137 */ 1138 enum vehicle_permission_model { 1139 /** 1140 * No special restriction, but each property can still require specific android app-level 1141 * permission. 1142 */ 1143 VEHICLE_PERMISSION_NO_RESTRICTION = 0, 1144 /** Signature only. Only APKs signed with OEM keys are allowed. */ 1145 VEHICLE_PERMISSION_OEM_ONLY = 0x1, 1146 /** System only. APKs built-in to system can access the property. */ 1147 VEHICLE_PERMISSION_SYSTEM_APP_ONLY = 0x2, 1148 /** Equivalent to system|signature */ 1149 VEHICLE_PERMISSION_OEM_OR_SYSTEM_APP = 0x3 1150 }; 1151 1152 1153 /** 1154 * Special values for INT32/FLOAT (including ZONED types) 1155 * These values represent special state, which is outside MIN/MAX range but can happen. 1156 * For example, HVAC temperature may use out of range min / max to represent that 1157 * it is working in full power although target temperature has separate min / max. 1158 * OUT_OF_RANGE_OFF can represent a state where the property is powered off. 1159 * Usually such property will have separate property to control power. 1160 */ 1161 1162 #define VEHICLE_INT_OUT_OF_RANGE_MAX (INT32_MAX) 1163 #define VEHICLE_INT_OUT_OF_RANGE_MIN (INT32_MIN) 1164 #define VEHICLE_INT_OUT_OF_RANGE_OFF (INT32_MIN + 1) 1165 1166 #define VEHICLE_FLOAT_OUT_OF_RANGE_MAX (INFINITY) 1167 #define VEHICLE_FLOAT_OUT_OF_RANGE_MIN (-INFINITY) 1168 #define VEHICLE_FLOAT_OUT_OF_RANGE_OFF (NAN) 1169 1170 /** 1171 * Car states. 1172 * 1173 * The driving states determine what features of the UI will be accessible. 1174 */ 1175 enum vehicle_driving_status { 1176 VEHICLE_DRIVING_STATUS_UNRESTRICTED = 0x00, 1177 VEHICLE_DRIVING_STATUS_NO_VIDEO = 0x01, 1178 VEHICLE_DRIVING_STATUS_NO_KEYBOARD_INPUT = 0x02, 1179 VEHICLE_DRIVING_STATUS_NO_VOICE_INPUT = 0x04, 1180 VEHICLE_DRIVING_STATUS_NO_CONFIG = 0x08, 1181 VEHICLE_DRIVING_STATUS_LIMIT_MESSAGE_LEN = 0x10 1182 }; 1183 1184 /** 1185 * Various gears which can be selected by user and chosen in system. 1186 */ 1187 enum vehicle_gear { 1188 // Gear selections present in both automatic and manual cars. 1189 VEHICLE_GEAR_NEUTRAL = 0x0001, 1190 VEHICLE_GEAR_REVERSE = 0x0002, 1191 1192 // Gear selections (mostly) present only in automatic cars. 1193 VEHICLE_GEAR_PARK = 0x0004, 1194 VEHICLE_GEAR_DRIVE = 0x0008, 1195 VEHICLE_GEAR_LOW = 0x0010, 1196 1197 // Other possible gear selections (maybe present in manual or automatic 1198 // cars). 1199 VEHICLE_GEAR_1 = 0x0010, 1200 VEHICLE_GEAR_2 = 0x0020, 1201 VEHICLE_GEAR_3 = 0x0040, 1202 VEHICLE_GEAR_4 = 0x0080, 1203 VEHICLE_GEAR_5 = 0x0100, 1204 VEHICLE_GEAR_6 = 0x0200, 1205 VEHICLE_GEAR_7 = 0x0400, 1206 VEHICLE_GEAR_8 = 0x0800, 1207 VEHICLE_GEAR_9 = 0x1000 1208 }; 1209 1210 1211 /** 1212 * Various zones in the car. 1213 * 1214 * Zones are used for Air Conditioning purposes and divide the car into physical 1215 * area zones. 1216 */ 1217 enum vehicle_zone { 1218 VEHICLE_ZONE_ROW_1_LEFT = 0x00000001, 1219 VEHICLE_ZONE_ROW_1_CENTER = 0x00000002, 1220 VEHICLE_ZONE_ROW_1_RIGHT = 0x00000004, 1221 VEHICLE_ZONE_ROW_1_ALL = 0x00000008, 1222 VEHICLE_ZONE_ROW_2_LEFT = 0x00000010, 1223 VEHICLE_ZONE_ROW_2_CENTER = 0x00000020, 1224 VEHICLE_ZONE_ROW_2_RIGHT = 0x00000040, 1225 VEHICLE_ZONE_ROW_2_ALL = 0x00000080, 1226 VEHICLE_ZONE_ROW_3_LEFT = 0x00000100, 1227 VEHICLE_ZONE_ROW_3_CENTER = 0x00000200, 1228 VEHICLE_ZONE_ROW_3_RIGHT = 0x00000400, 1229 VEHICLE_ZONE_ROW_3_ALL = 0x00000800, 1230 VEHICLE_ZONE_ROW_4_LEFT = 0x00001000, 1231 VEHICLE_ZONE_ROW_4_CENTER = 0x00002000, 1232 VEHICLE_ZONE_ROW_4_RIGHT = 0x00004000, 1233 VEHICLE_ZONE_ROW_4_ALL = 0x00008000, 1234 VEHICLE_ZONE_ALL = 0x80000000, 1235 }; 1236 1237 /** 1238 * Various Seats in the car. 1239 */ 1240 enum vehicle_seat { 1241 VEHICLE_SEAT_DRIVER_LHD = 0x0001, 1242 VEHICLE_SEAT_DRIVER_RHD = 0x0002, 1243 VEHICLE_SEAT_ROW_1_PASSENGER_LEFT = 0x0010, 1244 VEHICLE_SEAT_ROW_1_PASSENGER_CENTER = 0x0020, 1245 VEHICLE_SEAT_ROW_1_PASSENGER_RIGHT = 0x0040, 1246 VEHICLE_SEAT_ROW_2_PASSENGER_LEFT = 0x0100, 1247 VEHICLE_SEAT_ROW_2_PASSENGER_CENTER = 0x0200, 1248 VEHICLE_SEAT_ROW_2_PASSENGER_RIGHT = 0x0400, 1249 VEHICLE_SEAT_ROW_3_PASSENGER_LEFT = 0x1000, 1250 VEHICLE_SEAT_ROW_3_PASSENGER_CENTER = 0x2000, 1251 VEHICLE_SEAT_ROW_3_PASSENGER_RIGHT = 0x4000 1252 }; 1253 1254 /** 1255 * Various windshields/windows in the car. 1256 */ 1257 enum vehicle_window { 1258 VEHICLE_WINDOW_FRONT_WINDSHIELD = 0x0001, 1259 VEHICLE_WINDOW_REAR_WINDSHIELD = 0x0002, 1260 VEHICLE_WINDOW_ROOF_TOP = 0x0004, 1261 VEHICLE_WINDOW_ROW_1_LEFT = 0x0010, 1262 VEHICLE_WINDOW_ROW_1_RIGHT = 0x0020, 1263 VEHICLE_WINDOW_ROW_2_LEFT = 0x0100, 1264 VEHICLE_WINDOW_ROW_2_RIGHT = 0x0200, 1265 VEHICLE_WINDOW_ROW_3_LEFT = 0x1000, 1266 VEHICLE_WINDOW_ROW_3_RIGHT = 0x2000, 1267 }; 1268 1269 enum vehicle_door { 1270 VEHICLE_DOOR_ROW_1_LEFT = 0x00000001, 1271 VEHICLE_DOOR_ROW_1_RIGHT = 0x00000004, 1272 VEHICLE_DOOR_ROW_2_LEFT = 0x00000010, 1273 VEHICLE_DOOR_ROW_2_RIGHT = 0x00000040, 1274 VEHICLE_DOOR_ROW_3_LEFT = 0x00000100, 1275 VEHICLE_DOOR_ROW_3_RIGHT = 0x00000400, 1276 VEHICLE_DOOR_HOOD = 0x10000000, 1277 VEHICLE_DOOR_REAR = 0x20000000, 1278 }; 1279 1280 enum vehicle_mirror { 1281 VEHICLE_MIRROR_DRIVER_LEFT = 0x00000001, 1282 VEHICLE_MIRROR_DRIVER_RIGHT = 0x00000002, 1283 VEHICLE_MIRROR_DRIVER_CENTER = 0x00000004, 1284 }; 1285 enum vehicle_turn_signal { 1286 VEHICLE_SIGNAL_NONE = 0x00, 1287 VEHICLE_SIGNAL_RIGHT = 0x01, 1288 VEHICLE_SIGNAL_LEFT = 0x02, 1289 VEHICLE_SIGNAL_EMERGENCY = 0x04 1290 }; 1291 1292 /* 1293 * Boolean type. 1294 */ 1295 enum vehicle_boolean { 1296 VEHICLE_FALSE = 0x00, 1297 VEHICLE_TRUE = 0x01 1298 }; 1299 1300 typedef int32_t vehicle_boolean_t; 1301 1302 /** 1303 * Vehicle string. 1304 * 1305 * Defines a UTF8 encoded sequence of bytes that should be used for string 1306 * representation throughout. 1307 */ 1308 typedef struct vehicle_str { 1309 uint8_t* data; 1310 int32_t len; 1311 } vehicle_str_t; 1312 1313 /** 1314 * Vehicle byte array. 1315 * This is for passing generic raw data. 1316 */ 1317 typedef vehicle_str_t vehicle_bytes_t; 1318 1319 typedef struct vehicle_prop_config { 1320 int32_t prop; 1321 1322 /** 1323 * Defines if the property is read or write. Value should be one of 1324 * enum vehicle_prop_access. 1325 */ 1326 int32_t access; 1327 1328 /** 1329 * Defines if the property is continuous or on-change. Value should be one 1330 * of enum vehicle_prop_change_mode. 1331 */ 1332 int32_t change_mode; 1333 1334 /** 1335 * Type of data used for this property. This type is fixed per each property. 1336 * Check vehicle_value_type for allowed value. 1337 */ 1338 int32_t value_type; 1339 1340 /** 1341 * Define necessary permission model to access the data. 1342 */ 1343 int32_t permission_model; 1344 1345 /** 1346 * Some of the properties may have associated zones (such as hvac), in these 1347 * cases the config should contain an ORed value for the associated zone. 1348 */ 1349 union { 1350 /** 1351 * The value is derived by ORing one or more of enum vehicle_zone members. 1352 */ 1353 int32_t vehicle_zone_flags; 1354 /** The value is derived by ORing one or more of enum vehicle_seat members. */ 1355 int32_t vehicle_seat_flags; 1356 /** The value is derived by ORing one or more of enum vehicle_window members. */ 1357 int32_t vehicle_window_flags; 1358 }; 1359 1360 /** 1361 * Property specific configuration information. Usage of this will be defined per each property. 1362 */ 1363 union { 1364 /** 1365 * For generic configuration information 1366 */ 1367 int32_t config_flags; 1368 /** The number of presets that are stored by the radio module. Pass 0 if 1369 * there are no presets available. The range of presets is defined to be 1370 * from 1 (see VEHICLE_RADIO_PRESET_MIN_VALUE) to vehicle_radio_num_presets. 1371 */ 1372 int32_t vehicle_radio_num_presets; 1373 int32_t config_array[4]; 1374 }; 1375 1376 /** 1377 * Some properties may require additional information passed over this string. Most properties 1378 * do not need to set this and in that case, config_string.data should be NULL and 1379 * config_string.len should be 0. 1380 */ 1381 vehicle_str_t config_string; 1382 1383 /** 1384 * Specify minimum allowed value for the property. This is necessary for property which does 1385 * not have specified enum. 1386 */ 1387 union { 1388 float float_min_value; 1389 int32_t int32_min_value; 1390 int64_t int64_min_value; 1391 }; 1392 1393 /** 1394 * Specify maximum allowed value for the property. This is necessary for property which does 1395 * not have specified enum. 1396 */ 1397 union { 1398 float float_max_value; 1399 int32_t int32_max_value; 1400 int64_t int64_max_value; 1401 }; 1402 1403 /** 1404 * Array of min values for zoned properties. Zoned property can specify min / max value in two 1405 * different ways: 1406 * 1. All zones having the same min / max value: *_min/max_value should be set and this 1407 * array should be set to NULL. 1408 * 2. All zones having separate min / max value: *_min/max_values array should be populated 1409 * and its length should be the same as number of active zones specified by *_zone_flags. 1410 * 1411 * Should be NULL if each zone does not have separate max values. 1412 */ 1413 union { 1414 float* float_min_values; 1415 int32_t* int32_min_values; 1416 int64_t* int64_min_values; 1417 }; 1418 1419 /** 1420 * Array of max values for zoned properties. See above for its usage. 1421 * Should be NULL if each zone does not have separate max values. 1422 * If not NULL, length of array should match that of min_values. 1423 */ 1424 union { 1425 float* float_max_values; 1426 int32_t* int32_max_values; 1427 int64_t* int64_max_values; 1428 }; 1429 1430 /** 1431 * Min sample rate in Hz. Should be 0 for sensor type of VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 1432 */ 1433 float min_sample_rate; 1434 /** 1435 * Max sample rate in Hz. Should be 0 for sensor type of VEHICLE_PROP_CHANGE_MODE_ON_CHANGE 1436 */ 1437 float max_sample_rate; 1438 /** 1439 * Place holder for putting HAL implementation specific data. Usage is wholly up to HAL 1440 * implementation. 1441 */ 1442 void* hal_data; 1443 } vehicle_prop_config_t; 1444 1445 /** 1446 * HVAC property fields. 1447 * 1448 * Defines various HVAC properties which are packed into vehicle_hvac_t (see 1449 * below). We define these properties outside in global scope so that HAL 1450 * implementation and HAL users (JNI) can typecast vehicle_hvac correctly. 1451 */ 1452 typedef struct vehicle_hvac { 1453 /** 1454 * Define one structure for each possible HVAC property. 1455 * NOTES: 1456 * a) Fan speed is a number from (0 - 6) where 6 is the highest speed. (TODO define enum) 1457 * b) Temperature is a floating point Celcius scale. 1458 * c) Direction is defined in enum vehicle_fan_direction. 1459 * 1460 * The HAL should create #entries number of vehicle_hvac_properties and 1461 * assign it to "properties" variable below. 1462 */ 1463 union { 1464 int32_t fan_speed; 1465 int32_t fan_direction; 1466 vehicle_boolean_t ac_on; 1467 vehicle_boolean_t max_ac_on; 1468 vehicle_boolean_t max_defrost_on; 1469 vehicle_boolean_t recirc_on; 1470 vehicle_boolean_t dual_on; 1471 vehicle_boolean_t power_on; 1472 1473 float temperature_current; 1474 float temperature_set; 1475 1476 vehicle_boolean_t defrost_on; 1477 }; 1478 } vehicle_hvac_t; 1479 1480 /* 1481 * Defines how the values for various properties are represented. 1482 * 1483 * There are two ways to populate and access the fields: 1484 * a) Using the individual fields. Use this mechanism (see 1485 * info_manufacture_date, fuel_capacity fields etc). 1486 * b) Using the union accessors (see uint32_value, float_value etc). 1487 * 1488 * To add a new field make sure that it does not exceed the total union size 1489 * (defined in int_array) and it is one of the vehicle_value_type. Then add the 1490 * field name with its unit to union. If the field type is not yet defined (as 1491 * of this draft, we don't use int64_t) then add that type to vehicle_value_type 1492 * and have an accessor (so for int64_t it will be int64_t int64_value). 1493 */ 1494 typedef union vehicle_value { 1495 /** Define the max size of this structure. */ 1496 int32_t int32_array[4]; 1497 float float_array[4]; 1498 1499 // Easy accessors for union members (HAL implementation SHOULD NOT USE these 1500 // fields while populating, use the property specific fields below instead). 1501 int32_t int32_value; 1502 int64_t int64_value; 1503 float float_value; 1504 vehicle_str_t str_value; 1505 vehicle_bytes_t bytes_value; 1506 vehicle_boolean_t boolean_value; 1507 1508 // Vehicle Information. 1509 vehicle_str_t info_vin; 1510 vehicle_str_t info_make; 1511 vehicle_str_t info_model; 1512 int32_t info_model_year; 1513 1514 // Represented in milliliters. 1515 float info_fuel_capacity; 1516 1517 float vehicle_speed; 1518 float odometer; 1519 1520 // Engine sensors. 1521 1522 // Represented in milliliters. 1523 //float engine_coolant_level; 1524 // Represented in celcius. 1525 float engine_coolant_temperature; 1526 // Represented in a percentage value. 1527 //float engine_oil_level; 1528 // Represented in celcius. 1529 float engine_oil_temperature; 1530 float engine_rpm; 1531 1532 // Event sensors. 1533 // Value should be one of enum vehicle_gear_selection. 1534 int32_t gear_selection; 1535 // Value should be one of enum vehicle_gear. 1536 int32_t gear_current_gear; 1537 // Value should be one of enum vehicle_boolean. 1538 int32_t parking_brake; 1539 // If cruise_set_speed > 0 then cruise is ON otherwise cruise is OFF. 1540 // Unit: meters / second (m/s). 1541 //int32_t cruise_set_speed; 1542 // Value should be one of enum vehicle_boolean. 1543 int32_t is_fuel_level_low; 1544 // Value should be one of enum vehicle_driving_status. 1545 int32_t driving_status; 1546 int32_t night_mode; 1547 // Value should be one of emum vehicle_turn_signal. 1548 int32_t turn_signals; 1549 // Value should be one of enum vehicle_boolean. 1550 //int32_t engine_on; 1551 1552 // HVAC properties. 1553 vehicle_hvac_t hvac; 1554 1555 float outside_temperature; 1556 float cabin_temperature; 1557 1558 } vehicle_value_t; 1559 1560 /* 1561 * Encapsulates the property name and the associated value. It 1562 * is used across various API calls to set values, get values or to register for 1563 * events. 1564 */ 1565 typedef struct vehicle_prop_value { 1566 /* property identifier */ 1567 int32_t prop; 1568 1569 /* value type of property for quick conversion from union to appropriate 1570 * value. The value must be one of enum vehicle_value_type. 1571 */ 1572 int32_t value_type; 1573 1574 /** time is elapsed nanoseconds since boot */ 1575 int64_t timestamp; 1576 1577 /** 1578 * Zone information for zoned property. For non-zoned property, this should be ignored. 1579 */ 1580 union { 1581 int32_t zone; 1582 int32_t seat; 1583 int32_t window; 1584 }; 1585 1586 vehicle_value_t value; 1587 } vehicle_prop_value_t; 1588 1589 /* 1590 * Event callback happens whenever a variable that the API user has subscribed 1591 * to needs to be reported. This may be based purely on threshold and frequency 1592 * (a regular subscription, see subscribe call's arguments) or when the set() 1593 * command is executed and the actual change needs to be reported. 1594 * 1595 * event_data is OWNED by the HAL and should be copied before the callback 1596 * finishes. 1597 */ 1598 typedef int (*vehicle_event_callback_fn)(const vehicle_prop_value_t *event_data); 1599 1600 1601 /** 1602 * Represent the operation where the current error has happened. 1603 */ 1604 enum vehicle_property_operation { 1605 /** Generic error to this property which is not tied to any operation. */ 1606 VEHICLE_OPERATION_GENERIC = 0, 1607 /** Error happened while handling property set. */ 1608 VEHICLE_OPERATION_SET = 1, 1609 /** Error happened while handling property get. */ 1610 VEHICLE_OPERATION_GET = 2, 1611 /** Error happened while handling property subscription. */ 1612 VEHICLE_OPERATION_SUBSCRIBE = 3, 1613 }; 1614 1615 /* 1616 * Suggests that an error condition has occurred. 1617 * 1618 * @param error_code Error code. error_code should be standard error code with 1619 * negative value like -EINVAL. 1620 * @parm property Note a property where error has happened. If this is generic error, property 1621 * should be VEHICLE_PROPERTY_INVALID. 1622 * @param operation Represent the operation where the error has happened. Should be one of 1623 * vehicle_property_operation. 1624 */ 1625 typedef int (*vehicle_error_callback_fn)(int32_t error_code, int32_t property, int32_t operation); 1626 1627 /************************************************************************************/ 1628 1629 /* 1630 * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM 1631 * and the fields of this data structure must begin with hw_module_t 1632 * followed by module specific information. 1633 */ 1634 typedef struct vehicle_module { 1635 struct hw_module_t common; 1636 } vehicle_module_t; 1637 1638 1639 typedef struct vehicle_hw_device { 1640 struct hw_device_t common; 1641 1642 /** 1643 * After calling open on device the user should register callbacks for event and error 1644 * functions. 1645 */ 1646 int (*init)(struct vehicle_hw_device* device, 1647 vehicle_event_callback_fn event_fn, vehicle_error_callback_fn err_fn); 1648 /** 1649 * Before calling close the user should destroy the registered callback 1650 * functions. 1651 * In case the unsubscribe() call is not called on all properties before 1652 * release() then release() will unsubscribe the properties itself. 1653 */ 1654 int (*release)(struct vehicle_hw_device* device); 1655 1656 /** 1657 * Enumerate all available properties. The list is returned in "list". 1658 * @param num_properties number of properties contained in the retuned array. 1659 * @return array of property configs supported by this car. Note that returned data is const 1660 * and caller cannot modify it. HAL implementation should keep this memory until HAL 1661 * is released to avoid copying this again. 1662 */ 1663 vehicle_prop_config_t const *(*list_properties)(struct vehicle_hw_device* device, 1664 int* num_properties); 1665 1666 /** 1667 * Get a vehicle property value immediately. data should be allocated 1668 * properly. 1669 * The caller of the API OWNS the data field. 1670 * Caller will set data->prop, data->value_type, and optionally zone value for zoned property. 1671 * But HAL implementation needs to fill all entries properly when returning. 1672 * For pointer type, HAL implementation should allocate necessary memory and caller is 1673 * responsible for calling release_memory_from_get, which allows HAL to release allocated 1674 * memory. 1675 * For VEHICLE_PROP_CHANGE_MODE_STATIC type of property, get should return the same value 1676 * always. 1677 * For VEHICLE_PROP_CHANGE_MODE_ON_CHANGE type of property, it should return the latest value. 1678 * If there is no data available yet, which can happen during initial stage, this call should 1679 * return immediately with error code of -EAGAIN. 1680 */ 1681 int (*get)(struct vehicle_hw_device* device, vehicle_prop_value_t *data); 1682 1683 /** 1684 * Release memory allocated to data in previous get call. get call for byte or string involves 1685 * allocating necessary memory from vehicle hal. 1686 * To be safe, memory allocated by vehicle hal should be released by vehicle hal and vehicle 1687 * network service will call this when data from vehicle hal is no longer necessary. 1688 * vehicle hal implementation should only release member of vehicle_prop_value_t like 1689 * data->str_value.data or data->bytes_value.data but not data itself as data itself is 1690 * allocated from vehicle network service. Once memory is freed, corresponding pointer should 1691 * be set to NULL bu vehicle hal. 1692 */ 1693 void (*release_memory_from_get)(struct vehicle_hw_device* device, vehicle_prop_value_t *data); 1694 1695 /** 1696 * Set a vehicle property value. data should be allocated properly and not 1697 * NULL. 1698 * The caller of the API OWNS the data field. 1699 * timestamp of data will be ignored for set operation. 1700 * Setting some properties require having initial state available. Depending on the vehicle hal, 1701 * such initial data may not be available for short time after init. In such case, set call 1702 * can return -EAGAIN like get call. 1703 * For a property with separate power control, set can fail if the property is not powered on. 1704 * In such case, hal should return -ESHUTDOWN error. 1705 */ 1706 int (*set)(struct vehicle_hw_device* device, const vehicle_prop_value_t *data); 1707 1708 /** 1709 * Subscribe to events. 1710 * Depending on output of list_properties if the property is: 1711 * a) on-change: sample_rate should be set to 0. 1712 * b) supports frequency: sample_rate should be set from min_sample_rate to 1713 * max_sample_rate. 1714 * For on-change type of properties, vehicle network service will make another get call to check 1715 * the initial state. Due to this, vehicle hal implementation does not need to send initial 1716 * state for on-change type of properties. 1717 * @param device 1718 * @param prop 1719 * @param sample_rate 1720 * @param zones All subscribed zones for zoned property. can be ignored for non-zoned property. 1721 * 0 means all zones supported instead of no zone. 1722 */ 1723 int (*subscribe)(struct vehicle_hw_device* device, int32_t prop, float sample_rate, 1724 int32_t zones); 1725 1726 /** Cancel subscription on a property. */ 1727 int (*unsubscribe)(struct vehicle_hw_device* device, int32_t prop); 1728 1729 /** 1730 * Print out debugging state for the vehicle hal. This will be called by 1731 * the vehicle network service and will be included into the service' dump. 1732 * 1733 * The passed-in file descriptor can be used to write debugging text using 1734 * dprintf() or write(). The text should be in ASCII encoding only. 1735 * 1736 * Performance requirements: 1737 * 1738 * This must be a non-blocking call. The HAL should return from this call 1739 * in 1ms, must return from this call in 10ms. This call must avoid 1740 * deadlocks, as it may be called at any point of operation. 1741 * Any synchronization primitives used (such as mutex locks or semaphores) 1742 * should be acquired with a timeout. 1743 */ 1744 int (*dump)(struct vehicle_hw_device* device, int fd); 1745 1746 } vehicle_hw_device_t; 1747 1748 __END_DECLS 1749 1750 #endif // ANDROID_VEHICLE_INTERFACE_H 1751