Home | History | Annotate | Download | only in hardware
      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