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  */
87 #define VEHICLE_PROPERTY_INVALID (0x0)
88 
89 /**
90  * VIN of vehicle
91  * @value_type VEHICLE_VALUE_TYPE_STRING
92  * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
93  * @access VEHICLE_PROP_ACCESS_READ
94  * @data_member info_vin
95  */
96 #define VEHICLE_PROPERTY_INFO_VIN                                   (0x00000100)
97 
98 /**
99  * Maker name of vehicle
100  * @value_type VEHICLE_VALUE_TYPE_STRING
101  * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
102  * @access VEHICLE_PROP_ACCESS_READ
103  * @data_member info_make
104  */
105 #define VEHICLE_PROPERTY_INFO_MAKE                                  (0x00000101)
106 
107 /**
108  * Model of vehicle
109  * @value_type VEHICLE_VALUE_TYPE_STRING
110  * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
111  * @access VEHICLE_PROP_ACCESS_READ
112  * @data_member info_model
113  */
114 #define VEHICLE_PROPERTY_INFO_MODEL                                 (0x00000102)
115 
116 /**
117  * Model year of vehicle.
118  * @value_type VEHICLE_VALUE_TYPE_INT32
119  * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
120  * @access VEHICLE_PROP_ACCESS_READ
121  * @data_member info_model_year
122  * @unit VEHICLE_UNIT_TYPE_YEAR
123  */
124 #define VEHICLE_PROPERTY_INFO_MODEL_YEAR                            (0x00000103)
125 
126 /**
127  * Fuel capacity of the vehicle
128  * @value_type VEHICLE_VALUE_TYPE_FLOAT
129  * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
130  * @access VEHICLE_PROP_ACCESS_READ
131  * @data_member info_fuel_capacity
132  * @unit VEHICLE_UNIT_TYPE_VEHICLE_UNIT_TYPE_MILLILITER
133  */
134 #define VEHICLE_PROPERTY_INFO_FUEL_CAPACITY                         (0x00000104)
135 
136 
137 //==== Vehicle Performance Sensors ====
138 
139 /**
140  * Current odometer value of the vehicle
141  * @value_type VEHICLE_VALUE_TYPE_FLOAT
142  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
143  * @access VEHICLE_PROP_ACCESS_READ
144  * @data_member odometer
145  * @unit VEHICLE_UNIT_TYPE_KILOMETER
146  */
147 #define VEHICLE_PROPERTY_PERF_ODOMETER                              (0x00000204)
148 
149 /**
150  * Speed of the vehicle
151  * @value_type VEHICLE_VALUE_TYPE_FLOAT
152  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
153  * @access VEHICLE_PROP_ACCESS_READ
154  * @data_member vehicle_speed
155  * @unit VEHICLE_UNIT_TYPE_METER_PER_SEC
156  */
157 #define VEHICLE_PROPERTY_PERF_VEHICLE_SPEED                         (0x00000207)
158 
159 
160 //==== Engine Sensors ====
161 
162 /**
163  * Temperature of engine coolant
164  * @value_type VEHICLE_VALUE_TYPE_FLOAT
165  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
166  * @access VEHICLE_PROP_ACCESS_READ
167  * @data_member engine_coolant_temperature
168  * @unit VEHICLE_UNIT_TYPE_CELCIUS
169  */
170 #define VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP                        (0x00000301)
171 
172 /**
173  * Temperature of engine oil
174  * @value_type VEHICLE_VALUE_TYPE_FLOAT
175  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
176  * @access VEHICLE_PROP_ACCESS_READ
177  * @data_member engine_oil_temperature
178  * @unit VEHICLE_UNIT_TYPE_CELCIUS
179  */
180 #define VEHICLE_PROPERTY_ENGINE_OIL_TEMP                            (0x00000304)
181 /**
182  * Engine rpm
183  * @value_type VEHICLE_VALUE_TYPE_FLOAT
184  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
185  * @access VEHICLE_PROP_ACCESS_READ
186  * @data_member engine_rpm
187  * @unit VEHICLE_UNIT_TYPE_RPM
188  */
189 #define VEHICLE_PROPERTY_ENGINE_RPM                                 (0x00000305)
190 
191 //==== Event Sensors ====
192 
193 /**
194  * Currently selected gear
195  * @value_type VEHICLE_VALUE_TYPE_INT32
196  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
197  * @access VEHICLE_PROP_ACCESS_READ
198  * @data_member gear_selection
199  * @data_enum vehicle_gear
200  */
201 #define VEHICLE_PROPERTY_GEAR_SELECTION                             (0x00000400)
202 
203 /**
204  * Current gear. In non-manual case, selected gear does not necessarily match the current gear
205  * @value_type VEHICLE_VALUE_TYPE_INT32
206  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
207  * @access VEHICLE_PROP_ACCESS_READ
208  * @data_member gear_current_gear
209  * @data_enum vehicle_gear
210  */
211 #define VEHICLE_PROPERTY_CURRENT_GEAR                               (0x00000401)
212 
213 /**
214  * Parking brake state.
215  * @value_type VEHICLE_VALUE_TYPE_BOOLEAN
216  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
217  * @access VEHICLE_PROP_ACCESS_READ
218  * @data_member parking_brake
219  * @data_enum vehicle_boolean
220  */
221 #define VEHICLE_PROPERTY_PARKING_BRAKE_ON                           (0x00000402)
222 
223 /**
224  * Driving status policy.
225  * @value_type VEHICLE_VALUE_TYPE_INT32
226  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
227  * @access VEHICLE_PROP_ACCESS_READ
228  * @data_member driving_status
229  * @data_enum vehicle_driving_status
230  */
231 #define VEHICLE_PROPERTY_DRIVING_STATUS                             (0x00000404)
232 
233 /**
234  * Warning for fuel low level.
235  * @value_type VEHICLE_VALUE_TYPE_BOOLEAN
236  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
237  * @access VEHICLE_PROP_ACCESS_READ
238  * @data_member is_fuel_level_low
239  * @data_enum vehicle_boolean
240  */
241 #define VEHICLE_PROPERTY_FUEL_LEVEL_LOW                             (0x00000405)
242 
243 /**
244  * Night mode or not.
245  * @value_type VEHICLE_VALUE_TYPE_BOOLEAN
246  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
247  * @access VEHICLE_PROP_ACCESS_READ
248  * @data_member night_mode
249  * @data_enum vehicle_boolean
250  */
251 #define VEHICLE_PROPERTY_NIGHT_MODE                                 (0x00000407)
252 
253 
254 
255 //==== HVAC Properties ====
256 
257 /**
258  * Fan speed setting
259  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
260  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
261  * @access VEHICLE_PROP_ACCESS_READ_WRITE
262  * @data_member hvac.fan_speed
263  * @zone_type VEHICLE_ZONE_TYPE_ZONE
264  * @allow_out_of_range_value : OFF
265  */
266 #define VEHICLE_PROPERTY_HVAC_FAN_SPEED                             (0x00000500)
267 
268 /**
269  * Fan direction setting
270  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
271  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
272  * @access VEHICLE_PROP_ACCESS_READ_WRITE
273  * @data_member hvac.fan_direction
274  * @zone_type VEHICLE_ZONE_TYPE_ZONE
275  * @data_enum vehicle_hvac_fan_direction
276  * @allow_out_of_range_value : OFF
277  */
278 #define VEHICLE_PROPERTY_HVAC_FAN_DIRECTION                         (0x00000501)
279 
280 /*
281  * Bit flags for fan direction
282  */
283 enum vehicle_hvac_fan_direction {
284     VEHICLE_HVAC_FAN_DIRECTION_FACE                 = 0x1,
285     VEHICLE_HVAC_FAN_DIRECTION_FLOOR                = 0x2,
286     VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR       = 0x3,
287     VEHICLE_HVAC_FAN_DIRECTION_DEFROST              = 0x4,
288     VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR    = 0x5
289 };
290 
291 /**
292  * HVAC current temperature.
293  * @value_type VEHICLE_VALUE_TYPE_ZONED_FLOAT
294  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
295  * @access VEHICLE_PROP_ACCESS_READ_WRITE
296  * @zone_type VEHICLE_ZONE_TYPE_ZONE
297  * @data_member hvac.temperature_current
298  */
299 #define VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT                   (0x00000502)
300 
301 /**
302  * HVAC, target temperature set.
303  * @value_type VEHICLE_VALUE_TYPE_ZONED_FLOAT
304  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
305  * @access VEHICLE_PROP_ACCESS_READ_WRITE
306  * @zone_type VEHICLE_ZONE_TYPE_ZONE
307  * @data_member hvac.temperature_set
308  * @allow_out_of_range_value : MIN / MAX / OFF
309  */
310 #define VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET                       (0x00000503)
311 
312 /**
313  * On/off defrost
314  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
315  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
316  * @access VEHICLE_PROP_ACCESS_READ_WRITE
317  * @zone_type VEHICLE_ZONE_TYPE_WINDOW
318  * @data_member hvac.defrost_on
319  */
320 #define VEHICLE_PROPERTY_HVAC_DEFROSTER                             (0x00000504)
321 
322 /**
323  * On/off AC
324  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
325  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
326  * @access VEHICLE_PROP_ACCESS_READ_WRITE
327  * @config_flags Supported zones
328  * @zone_type VEHICLE_ZONE_TYPE_ZONE
329  * @data_member hvac.ac_on
330  */
331 #define VEHICLE_PROPERTY_HVAC_AC_ON                                 (0x00000505)
332 
333 /**
334  * On/off max AC
335  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
336  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
337  * @access VEHICLE_PROP_ACCESS_READ_WRITE
338  * @zone_type VEHICLE_ZONE_TYPE_ZONE
339  * @data_member hvac.max_ac_on
340  */
341 #define VEHICLE_PROPERTY_HVAC_MAX_AC_ON                             (0x00000506)
342 
343 /**
344  * On/off max defrost
345  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
346  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
347  * @access VEHICLE_PROP_ACCESS_READ_WRITE
348  * @zone_type VEHICLE_ZONE_TYPE_ZONE
349  * @data_member hvac.max_defrost_on
350  */
351 #define VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON                        (0x00000507)
352 
353 /**
354  * On/off re-circulation
355  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
356  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
357  * @access VEHICLE_PROP_ACCESS_READ_WRITE
358  * @zone_type VEHICLE_ZONE_TYPE_ZONE
359  * @data_member hvac.max_recirc_on
360  */
361 #define VEHICLE_PROPERTY_HVAC_RECIRC_ON                             (0x00000508)
362 
363 /**
364  * On/off dual. This will be defined per each row.
365  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
366  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
367  * @access VEHICLE_PROP_ACCESS_READ_WRITE
368  * @zone_type VEHICLE_ZONE_TYPE_ZONE
369  * @data_member hvac.dual_on
370  */
371 #define VEHICLE_PROPERTY_HVAC_DUAL_ON                               (0x00000509)
372 
373 /**
374  * On/off automatic mode
375  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
376  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
377  * @access VEHICLE_PROP_ACCESS_READ_WRITE
378  * @zone_type VEHICLE_ZONE_TYPE_ZONE
379  * @data_member hvac.auto_on
380  */
381 #define VEHICLE_PROPERTY_HVAC_AUTO_ON                               (0x0000050A)
382 
383 /**
384  * Seat temperature
385  *
386  * Negative values indicate cooling.
387  * 0 indicates off.
388  * Positive values indicate heating.
389  *
390  * Some vehicles may have multiple levels of heating and cooling. The min/max
391  * range defines the allowable range and number of steps in each direction.
392  *
393  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
394  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
395  * @access VEHICLE_PROP_ACCESS_READ_WRITE
396  * @zone_type VEHICLE_ZONE_TYPE_SEAT
397  * @data_member int32_value
398  */
399 #define VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE                      (0x0000050B)
400 
401 /**
402  * Side Mirror Heat
403  *
404  * Increase values denote higher heating levels for side mirrors.
405  * 0 indicates heating is turned off.
406  *
407  * @value_type VEHICLE_VALUE_TYPE_INT32
408  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
409  * @access VEHICLE_PROP_ACCESS_READ_WRITE
410  * @data_member int32_value
411  */
412 #define VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT                      (0x0000050C)
413 
414 /**
415  * Steering Wheel Temperature
416  *
417  * Sets the temperature for the steering wheel
418  * Positive value indicates heating.
419  * Negative value indicates cooling.
420  * 0 indicates tempreature control is off.
421  *
422  * @value_type VEHICLE_VALUE_TYPE_INT32
423  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
424  * @access VEHICLE_PROP_ACCESS_READ_WRITE
425  * @data_member int32_value
426  */
427 #define VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP                   (0x0000050D)
428 
429 /**
430  * Temperature units
431  *
432  * Indicates whether the temperature is in Celsius, Fahrenheit, or a different unit.
433  * This parameter affects all HVAC temperatures in the system.
434  *
435  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
436  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
437  * @access VEHICLE_PROP_ACCESS_READ
438  * @data_enum vehicle_unit_type
439  * @data_member int32_value
440  */
441 #define VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS                     (0x0000050E)
442 
443 /**
444  * Actual fan speed
445  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
446  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
447  * @access VEHICLE_PROP_ACCESS_READ
448  * @data_member hvac.fan_speed
449  * @zone_type VEHICLE_ZONE_TYPE_ZONE
450  * @allow_out_of_range_value : OFF
451  */
452 #define VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM                  (0x0000050F)
453 
454 
455 /**
456  * Represents power state for HVAC. Some HVAC properties will require matching power to be turned on
457  * to get out of OFF state. For non-zoned HVAC properties, VEHICLE_ALL_ZONE corresponds to
458  * global power state.
459  *
460  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
461  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
462  * @access VEHICLE_PROP_ACCESS_READ_WRITE
463  * @config_string list of HVAC properties whose power is controlled by this property. Format is
464  *                hexa-decimal number (0x...) separated by comma like "0x500,0x503". All zones
465  *                defined in these affected properties should be available in the property.
466  * @zone_type VEHICLE_ZONE_TYPE_ZONE
467  * @data_member hvac.power_on
468  */
469 #define VEHICLE_PROPERTY_HVAC_POWER_ON                              (0x00000510)
470 
471 /**
472  * Fan Positions Available
473  *
474  * This is a bit mask of fan positions available for the zone.  Each entry in
475  * vehicle_hvac_fan_direction is selected by bit position.  For instance, if
476  * only the FAN_DIRECTION_FACE (0x1) and FAN_DIRECTION_DEFROST (0x4) are available,
477  * then this value shall be set to 0x12.
478  *
479  * 0x12 = (1 << 1) | (1 << 4)
480  *
481  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
482  * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
483  * @access VEHICLE_PROP_ACCESS_READ
484  * @data_member int32_value
485  * @zone_type VEHICLE_ZONE_TYPE_ZONE
486  * @allow_out_of_range_value : OFF
487  */
488 #define VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE               (0x00000511)
489 
490 /**
491  * Outside temperature
492  * @value_type VEHICLE_VALUE_TYPE_FLOAT
493  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
494  * @access VEHICLE_PROP_ACCESS_READ
495  * @data_member outside_temperature
496  * @unit VEHICLE_UNIT_TYPE_CELCIUS
497  */
498 #define VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE                    (0x00000703)
499 
500 
501 /**
502  * Cabin temperature
503  * @value_type VEHICLE_VALUE_TYPE_FLOAT
504  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE|VEHICLE_PROP_CHANGE_MODE_CONTINUOUS
505  * @access VEHICLE_PROP_ACCESS_READ
506  * @data_member cabin_temperature
507  * @unit VEHICLE_UNIT_TYPE_CELCIUS
508  */
509 #define VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE                      (0x00000704)
510 
511 
512 /*
513  * Radio features.
514  */
515 /**
516  * Radio presets stored on the Car radio module. The data type used is int32
517  * array with the following fields:
518  * <ul>
519  *    <li> int32_array[0]: Preset number </li>
520  *    <li> int32_array[1]: Band type (see #RADIO_BAND_FM in
521  *    system/core/include/system/radio.h).
522  *    <li> int32_array[2]: Channel number </li>
523  *    <li> int32_array[3]: Sub channel number </li>
524  * </ul>
525  *
526  * NOTE: When getting a current preset config ONLY set preset number (i.e.
527  * int32_array[0]). For setting a preset other fields are required.
528  *
529  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4
530  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
531  * @access VEHICLE_PROP_ACCESS_READ_WRITE
532  * @config_flags Number of presets supported
533  * @data_member int32_array
534  */
535 #define VEHICLE_PROPERTY_RADIO_PRESET                               (0x00000801)
536 
537 /**
538  * Constants relevant to radio.
539  */
540 enum vehicle_radio_consts {
541     /** Minimum value for the radio preset */
542     VEHICLE_RADIO_PRESET_MIN_VALUE = 1,
543 };
544 
545 /**
546  * Represents audio focus state of Android side. Note that car's audio module will own audio
547  * focus and grant audio focus to Android side when requested by Android side. The focus has both
548  * per stream characteristics and global characteristics.
549  *
550  * Focus request (get of this property) will take the following form in int32_vec4:
551  *   int32_array[0]: vehicle_audio_focus_request type
552  *   int32_array[1]: bit flags of streams requested by this focus request. There can be up to
553  *                   32 streams.
554  *   int32_array[2]: External focus state flags. For request, only flag like
555  *                   VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG or
556  *                   VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG can be used.
557  *                   VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG is for case like radio where android
558  *                   side app still needs to hold focus but playback is done outside Android.
559  *                   VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG is for muting media channel
560  *                   including radio. VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG can be set even
561  *                   if android side releases focus (request type REQUEST_RELEASE). In that case,
562  *                   audio module should maintain mute state until user's explicit action to
563  *                   play some media.
564  *   int32_array[3]: Currently active audio contexts. Use combination of flags from
565  *                   vehicle_audio_context_flag.
566  *                   This can be used as a hint to adjust audio policy or other policy decision.
567  *                   Note that there can be multiple context active at the same time. And android
568  *                   can send the same focus request type gain due to change in audio contexts.
569  * Note that each focus request can request multiple streams that is expected to be used for
570  * the current request. But focus request itself is global behavior as GAIN or GAIN_TRANSIENT
571  * expects all sounds played by car's audio module to stop. Note that stream already allocated to
572  * android before this focus request should not be affected by focus request.
573  *
574  * Focus response (set and subscription callback for this property) will take the following form:
575  *   int32_array[0]: vehicle_audio_focus_state type
576  *   int32_array[1]: bit flags of streams allowed.
577  *   int32_array[2]: External focus state: bit flags of currently active audio focus in car
578  *                   side (outside Android). Active audio focus does not necessarily mean currently
579  *                   playing, but represents the state of having focus or waiting for focus
580  *                   (pause state).
581  *                   One or combination of flags from vehicle_audio_ext_focus_flag.
582  *                   0 means no active audio focus holder outside Android.
583  *                   The state will have following values for each vehicle_audio_focus_state_type:
584  *                   GAIN: 0 or VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY when radio is active in
585  *                       Android side.
586  *                   GAIN_TRANSIENT: 0. Can be VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT or
587  *                       VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT if android side has requested
588  *                       GAIN_TRANSIENT_MAY_DUCK and car side is ducking.
589  *                   LOSS: 0 when no focus is audio is active in car side.
590  *                       VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT when car side is playing something
591  *                       permanent.
592  *                   LOSS_TRANSIENT: always should be VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT
593  *   int32_array[3]: context requested by android side when responding to focus request.
594  *                   When car side is taking focus away, this should be zero.
595  *
596  * A focus response should be sent per each focus request even if there is no change in
597  * focus state. This can happen in case like focus request only involving context change
598  * where android side still needs matching focus response to confirm that audio module
599  * has made necessary changes.
600  *
601  * If car does not support VEHICLE_PROPERTY_AUDIO_FOCUS, focus is assumed to be granted always.
602  *
603  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4
604  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
605  * @access VEHICLE_PROP_ACCESS_READ_WRITE
606  * @data_member int32_array
607  */
608 #define VEHICLE_PROPERTY_AUDIO_FOCUS                                (0x00000900)
609 
610 enum vehicle_audio_focus_request {
611     VEHICLE_AUDIO_FOCUS_REQUEST_GAIN = 0x1,
612     VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT = 0x2,
613     VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK = 0x3,
614     /**
615      * This is for the case where android side plays sound like UI feedback
616      * and car side does not need to duck existing playback as long as
617      * requested stream is available.
618      */
619     VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK  = 0x4,
620     VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE = 0x5,
621 };
622 
623 enum vehicle_audio_focus_state {
624     /**
625      * Android side has permanent focus and can play allowed streams.
626      */
627     VEHICLE_AUDIO_FOCUS_STATE_GAIN = 0x1,
628     /**
629      * Android side has transient focus and can play allowed streams.
630      */
631     VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT = 0x2,
632     /**
633      * Car audio module is playing guidance kind of sound outside Android. Android side can
634      * still play through allowed streams with ducking.
635      */
636     VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK = 0x3,
637     /**
638      * Car audio module is playing transient sound outside Android. Android side should stop
639      * playing any sounds.
640      */
641     VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT = 0x4,
642     /**
643      * Android side has lost focus and cannot play any sound.
644      */
645     VEHICLE_AUDIO_FOCUS_STATE_LOSS = 0x5,
646     /**
647      * car audio module is playing safety critical sound, and Android side cannot request focus
648      * until the current state is finished. car audio module should restore it to the previous
649      * state when it can allow Android to play.
650      */
651     VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE = 0x6,
652 };
653 
654 /**
655  * Flags to represent multiple streams by combining these.
656  */
657 enum vehicle_audio_stream_flag {
658     VEHICLE_AUDIO_STREAM_STREAM0_FLAG = (0x1<<0),
659     VEHICLE_AUDIO_STREAM_STREAM1_FLAG = (0x1<<1),
660     VEHICLE_AUDIO_STREAM_STREAM2_FLAG = (0x1<<2),
661 };
662 
663 /**
664  * Represents stream number (always 0 to N -1 where N is max number of streams).
665  * Can be used for audio related property expecting one stream.
666  */
667 enum vehicle_audio_stream {
668     VEHICLE_AUDIO_STREAM0 = 0,
669     VEHICLE_AUDIO_STREAM1 = 1,
670 };
671 
672 /**
673  * Flag to represent external focus state (outside Android).
674  */
675 enum vehicle_audio_ext_focus_flag {
676     /**
677      * No external focus holder.
678      */
679     VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG = 0x0,
680     /**
681      * Car side (outside Android) has component holding GAIN kind of focus state.
682      */
683     VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG = 0x1,
684     /**
685      * Car side (outside Android) has component holding GAIN_TRANSIENT kind of focus state.
686      */
687     VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG = 0x2,
688     /**
689      * Car side is expected to play something while focus is held by Android side. One example
690      * can be radio attached in car side. But Android's radio app still should have focus,
691      * and Android side should be in GAIN state, but media stream will not be allocated to Android
692      * side and car side can play radio any time while this flag is active.
693      */
694     VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG = 0x4,
695     /**
696      * Car side should mute any media including radio. This can be used with any focus request
697      * including GAIN* and RELEASE.
698      */
699     VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG = 0x8,
700 };
701 
702 /**
703  * Index in int32_array for VEHICLE_PROPERTY_AUDIO_FOCUS property.
704  */
705 enum vehicle_audio_focus_index {
706     VEHICLE_AUDIO_FOCUS_INDEX_FOCUS = 0,
707     VEHICLE_AUDIO_FOCUS_INDEX_STREAMS = 1,
708     VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE = 2,
709     VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS = 3,
710 };
711 
712 /**
713  * Flags to tell the current audio context.
714  */
715 enum vehicle_audio_context_flag {
716     /** Music playback is currently active. */
717     VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG                      = 0x1,
718     /** Navigation is currently running. */
719     VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG                 = 0x2,
720     /** Voice command session is currently running. */
721     VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG              = 0x4,
722     /** Voice call is currently active. */
723     VEHICLE_AUDIO_CONTEXT_CALL_FLAG                       = 0x8,
724     /** Alarm is active. This may be only used in VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY. */
725     VEHICLE_AUDIO_CONTEXT_ALARM_FLAG                      = 0x10,
726     /**
727      * Notification sound is active. This may be only used in VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY.
728      */
729     VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG               = 0x20,
730     /**
731      * Context unknown. Only used for VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY to represent default
732      * stream for unknown contents.
733      */
734     VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG                    = 0x40,
735     /** Safety alert / warning is played. */
736     VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG               = 0x80,
737     /** CD / DVD kind of audio is played */
738     VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG                     = 0x100,
739     /** Aux audio input is played */
740     VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG                  = 0x200,
741     /** system sound like UI feedback */
742     VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG               = 0x400,
743     /** Radio is played */
744     VEHICLE_AUDIO_CONTEXT_RADIO_FLAG                      = 0x800,
745     /** Ext source is played. This is for tagging generic ext sources. */
746     VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG                 = 0x1000,
747 };
748 
749 /**
750  * Property to control audio volume of each audio context.
751  *
752  * vehicle_prop_config_t
753  *   config_array[0] : bit flags of all supported audio contexts. If this is 0,
754  *                     audio volume is controlled per physical stream
755  *   config_array[1] : flags defined in vehicle_audio_volume_capability_flag to
756  *                     represent audio module's capability.
757  *
758  * Data type looks like:
759  *   int32_array[0] : stream context as defined in vehicle_audio_context_flag. If only physical
760                       stream is supported (config_array[0] == 0), this will represent physical
761                       stream number.
762  *   int32_array[1] : volume level, valid range is 0 to int32_max_value defined in config.
763  *                    0 will be mute state. int32_min_value in config should be always 0.
764  *   int32_array[2] : One of vehicle_audio_volume_state.
765  *
766  * This property requires per stream based get. HAL implementation should check stream number
767  * in get call to return the right volume.
768  *
769  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC3
770  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
771  * @access VEHICLE_PROP_ACCESS_READ_WRITE
772  * @config_flags all audio contexts supported.
773  * @data_member int32_array
774  */
775 #define VEHICLE_PROPERTY_AUDIO_VOLUME                               (0x00000901)
776 
777 
778 /**
779  * flags to represent capability of audio volume property.
780  * used in config_array[1] of vehicle_prop_config_t.
781  */
782 enum vehicle_audio_volume_capability_flag {
783     /**
784      * External audio module or vehicle hal has persistent storage
785      * to keep the volume level. This should be set only when per context
786      * volume level is supproted. When this is set, audio volume level per
787      * each context will be retrieved from the property when systen starts up.
788      * And external audio module is also expected to adjust volume automatically
789      * whenever there is an audio context change.
790      * When this flag is not set, android side will assume that there is no
791      * persistent storage and stored value in android side will be used to
792      * initialize the volume level. And android side will set volume level
793      * of each physical streams whenever there is an audio context change.
794      */
795     VEHICLE_AUDIO_VOLUME_CAPABILITY_PERSISTENT_STORAGE = 0x1,
796     /**
797      * When this flag is set, the H/W can support only single master volume for all streams.
798      * There is no way to set volume level differently per each stream or context.
799      */
800     VEHICLE_AUDIO_VOLUME_CAPABILITY_MASTER_VOLUME_ONLY = 0x2,
801 };
802 
803 
804 /**
805  * enum to represent audio volume state.
806  */
807 enum vehicle_audio_volume_state {
808     VEHICLE_AUDIO_VOLUME_STATE_OK            = 0,
809     /**
810      * Audio volume has reached volume limit set in VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT
811      * and user's request to increase volume further is not allowed.
812      */
813     VEHICLE_AUDIO_VOLUME_STATE_LIMIT_REACHED = 1,
814 };
815 
816 /**
817  * Index in int32_array for VEHICLE_PROPERTY_AUDIO_VOLUME property.
818  */
819 enum vehicle_audio_volume_index {
820     VEHICLE_AUDIO_VOLUME_INDEX_STREAM = 0,
821     VEHICLE_AUDIO_VOLUME_INDEX_VOLUME = 1,
822     VEHICLE_AUDIO_VOLUME_INDEX_STATE = 2,
823 };
824 
825 /**
826  * Property for handling volume limit set by user. This limits maximum volume that can be set
827  * per each context or physical stream.
828  *
829  * vehicle_prop_config_t
830  *   config_array[0] : bit flags of all supported audio contexts. If this is 0,
831  *                     audio volume is controlled per physical stream
832  *   config_array[1] : flags defined in vehicle_audio_volume_capability_flag to
833  *                     represent audio module's capability.
834  *
835  * Data type looks like:
836  *   int32_array[0] : stream context as defined in vehicle_audio_context_flag. If only physical
837  *                    stream is supported (config_array[0] == 0), this will represent physical
838  *                    stream number.
839  *   int32_array[1] : maximum volume set to the stream. If there is no restriction, this value
840  *                    will be  bigger than VEHICLE_PROPERTY_AUDIO_VOLUME's max value.
841  *
842  * If car does not support this feature, this property should not be populated by HAL.
843  * This property requires per stream based get. HAL implementation should check stream number
844  * in get call to return the right volume.
845  *
846  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC2
847  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
848  * @access VEHICLE_PROP_ACCESS_READ_WRITE
849  * @config_flags all audio contexts supported.
850  * @data_member int32_array
851  */
852 #define VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT                         (0x00000902)
853 
854 /**
855  * Index in int32_array for VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT property.
856  */
857 enum vehicle_audio_volume_limit_index {
858     VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM = 0,
859     VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME = 1,
860 };
861 
862 /**
863  * Property to share audio routing policy of android side. This property is set at the beginning
864  * to pass audio policy in android side down to vehicle HAL and car audio module.
865  * This can be used as a hint to adjust audio policy or other policy decision.
866  *
867  *   int32_array[0] : audio stream where the audio for the application context will be routed
868  *                    by default. Note that this is the default setting from system, but each app
869  *                    may still use different audio stream for whatever reason.
870  *   int32_array[1] : All audio contexts that will be sent through the physical stream. Flag
871  *                    is defined in vehicle_audio_context_flag.
872 
873  * Setting of this property will be done for all available physical streams based on audio H/W
874  * variant information acquired from VEHICLE_PROPERTY_AUDIO_HW_VARIANT property.
875  *
876  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC2
877  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
878  * @access VEHICLE_PROP_ACCESS_WRITE
879  * @data_member int32_array
880  */
881 #define VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY                       (0x00000903)
882 
883 /**
884  * Index in int32_array for VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY property.
885  */
886 enum vehicle_audio_routing_policy_index {
887     VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM = 0,
888     VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS = 1,
889 };
890 
891 /**
892 * Property to return audio H/W variant type used in this car. This allows android side to
893 * support different audio policy based on H/W variant used. Note that other components like
894 * CarService may need overlay update to support additional variants. If this property does not
895 * exist, default audio policy will be used.
896 *
897 * @value_type VEHICLE_VALUE_TYPE_INT32
898 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
899 * @access VEHICLE_PROP_ACCESS_READ
900 * @config_flags Additional info on audio H/W. Should use vehicle_audio_hw_variant_config_flag for
901 *               this.
902 * @data_member int32_value
903 */
904 #define VEHICLE_PROPERTY_AUDIO_HW_VARIANT                           (0x00000904)
905 
906 /**
907  * Flag to be used in vehicle_prop_config.config_flags for VEHICLE_PROPERTY_AUDIO_HW_VARIANT.
908  */
909 enum vehicle_audio_hw_variant_config_flag {
910     /**
911      * Flag to tell that radio is internal to android and radio should
912      * be treated like other android stream like media.
913      * When this flag is not set or AUDIO_HW_VARIANT does not exist,
914      * radio is treated as external module. This brins some delta in audio focus
915      * handling as well.
916      */
917     VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG = 0x1,
918 };
919 
920 /** audio routing for AM/FM. This should be also be the value when there is only one
921     radio module in the system. */
922 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_AM_FM "RADIO_AM_FM"
923 /** Should be added only when there is a separate radio module with HD capability. */
924 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_AM_FM_HD "RADIO_AM_FM_HD"
925 /** For digial audio broadcasting type of radio */
926 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_DAB "RADIO_DAB"
927 /** For satellite type of radio */
928 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_SATELLITE "RADIO_SATELLITE"
929 /** For CD or DVD */
930 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_CD_DVD "CD_DVD"
931 /** For 1st auxiliary input */
932 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_AUX_IN0 "AUX_IN0"
933 /** For 2nd auxiliary input */
934 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_AUX_IN1 "AUX_IN1"
935 /** For navigation guidance from outside android */
936 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_NAV_GUIDANCE "EXT_NAV_GUIDANCE"
937 /** For voice command from outside android */
938 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_VOICE_COMMAND "EXT_VOICE_COMMAND"
939 /** For voice call from outside android */
940 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_VOICE_CALL "EXT_VOICE_CALL"
941 /** For safety alert from outside android */
942 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_SAFETY_ALERT "EXT_SAFETY_ALERT"
943 
944 /**
945 * Property to pass hint on external audio routing. When android side request focus
946 * with VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG flag, this property will be set
947 * before setting AUDIO_FOCUS property as a hint for external audio source routing.
948 * Note that setting this property alone should not trigger any change.
949 * Audio routing should be changed only when AUDIO_FOCUS property is set. Note that
950 * this property allows passing custom value as long as it is defined in config_string.
951 * This allows supporting non-standard routing options through this property.
952 * It is recommended to use separate name space for custom property to prevent conflict in future
953 * android releases.
954 * Enabling each external routing option is done by enabling each bit flag for the routing.
955 * This property can support up to 128 external routings.
956 * To give full flexibility, there is no standard definition for each bit flag and
957 * assigning each big flag to specific routing type is decided by config_string.
958 * config_string has format of each entry separated by ','
959 * and each entry has format of bitFlagPositon:typeString[:physicalStreamNumber].
960 *  bitFlagPosition: represents which big flag will be set to enable this routing. 0 means
961 *    LSB in int32_array[0]. 31 will be MSB in int32_array[0]. 127 will MSB in int32_array[3].
962 *  typeString: string representation of external routing. Some types are already defined
963 *    in VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_* and use them first before adding something
964 *    custom. Applications will find each routing using this string.
965 *  physicalStreamNumber: This part is optional and represents physical stream to android
966 *    which will be disabled when this routing is enabled. If not specified, this routing
967 *    should not affect physical streams to android.
968 * As an example, let's assume a system with two physical streams, 0 for media and 1 for
969 * nav guidance. And let's assume external routing option of am fm radio, external navigation
970 * guidance, satellite radio, and one custom. Let's assume that radio and satellite replaces
971 * physical stream 0 and external navigation replaces physical stream 1. And bit flag will be
972 * assigned in the order listed above. This configuration will look like this in config_string:
973 *  "0:RADIO_AM_FM:0,1:EXT_NAV_GUIDANCE:1,2:RADIO_SATELLITE:0,3:com.test.SOMETHING_CUSTOM"
974 * When android requests RADIO_AM_FM, int32_array[0] will be set to 0x1.
975 * When android requests RADIO_SATELLITE + EXT_NAV_GUIDANCE, int32_array[0] will be set to 0x2|0x4.
976 *
977 * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4
978 * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
979 * @access VEHICLE_PROP_ACCESS_WRITE|VEHICLE_PROP_ACCESS_READ_WRITE
980 * @config_string List of all avaiable external source in the system.
981 * @data_member int32_array
982 */
983 #define VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT                     (0x00000905)
984 
985 /**
986  * Property to control power state of application processor.
987  *
988  * It is assumed that AP's power state is controller by separate power controller.
989  *
990  * For configuration information, vehicle_prop_config.config_flags can have bit flag combining
991  * values in vehicle_ap_power_state_config_type.
992  *
993  * For get / notification, data type looks like this:
994  *   int32_array[0] : vehicle_ap_power_state_type
995  *   int32_array[1] : additional parameter relevant for each state. should be 0 if not used.
996  * For set, data type looks like this:
997  *   int32_array[0] : vehicle_ap_power_state_set_type
998  *   int32_array[1] : additional parameter relevant for each request. should be 0 if not used.
999  *
1000  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC2
1001  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1002  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1003  * @config_flags Additional info on power state. Should use vehicle_ap_power_state_config_flag.
1004  * @data_member int32_array
1005  */
1006 #define VEHICLE_PROPERTY_AP_POWER_STATE                             (0x00000A00)
1007 
1008 enum vehicle_ap_power_state_config_flag {
1009     /**
1010      * AP can enter deep sleep state. If not set, AP will always shutdown from
1011      * VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE power state.
1012      */
1013     VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG = 0x1,
1014 
1015     /**
1016      * The power controller can power on AP from off state after timeout specified in
1017      * VEHICLE_AP_POWER_SET_SHUTDOWN_READY message.
1018      */
1019     VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG = 0x2,
1020 };
1021 
1022 enum vehicle_ap_power_state {
1023     /** vehicle HAL will never publish this state to AP */
1024     VEHICLE_AP_POWER_STATE_OFF = 0,
1025     /** vehicle HAL will never publish this state to AP */
1026     VEHICLE_AP_POWER_STATE_DEEP_SLEEP = 1,
1027     /** AP is on but display should be off. */
1028     VEHICLE_AP_POWER_STATE_ON_DISP_OFF = 2,
1029     /** AP is on with display on. This state allows full user interaction. */
1030     VEHICLE_AP_POWER_STATE_ON_FULL = 3,
1031     /**
1032      * The power controller has requested AP to shutdown. AP can either enter sleep state or start
1033      * full shutdown. AP can also request postponing shutdown by sending
1034      * VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE message. The power controller should change power
1035      * state to this state to shutdown system.
1036      *
1037      * int32_array[1] : one of enum_vehicle_ap_power_state_shutdown_param_type
1038      */
1039     VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE = 4,
1040 };
1041 
1042 enum vehicle_ap_power_state_shutdown_param {
1043     /** AP should shutdown immediately. Postponing is not allowed. */
1044     VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY = 1,
1045     /** AP can enter deep sleep instead of shutting down completely. */
1046     VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP = 2,
1047     /** AP can only shutdown with postponing allowed. */
1048     VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_ONLY = 3,
1049 };
1050 
1051 enum vehicle_ap_power_set_state {
1052     /**
1053      * AP has finished boot up, and can start shutdown if requested by power controller.
1054      */
1055     VEHICLE_AP_POWER_SET_BOOT_COMPLETE = 0x1,
1056     /**
1057      * AP is entering deep sleep state. How this state is implemented may vary depending on
1058      * each H/W, but AP's power should be kept in this state.
1059      */
1060     VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY = 0x2,
1061     /**
1062      * AP is exiting from deep sleep state, and is in VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE state.
1063      * The power controller may change state to other ON states based on the current state.
1064      */
1065     VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT = 0x3,
1066     /**
1067      * int32_array[1]: Time to postpone shutdown in ms. Maximum value can be 5000 ms.
1068      *                 If AP needs more time, it will send another POSTPONE message before
1069      *                 the previous one expires.
1070      */
1071     VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE = 0x4,
1072     /**
1073      * AP is starting shutting down. When system completes shutdown, everything will stop in AP
1074      * as kernel will stop all other contexts. It is responsibility of vehicle HAL or lower level
1075      * to synchronize that state with external power controller. As an example, some kind of ping
1076      * with timeout in power controller can be a solution.
1077      *
1078      * int32_array[1]: Time to turn on AP in secs. Power controller may turn on AP after specified
1079      *                 time so that AP can run tasks like update. If it is set to 0, there is no
1080      *                 wake up, and power controller may not necessarily support wake-up.
1081      *                 If power controller turns on AP due to timer, it should start with
1082      *                 VEHICLE_AP_POWER_STATE_ON_DISP_OFF state, and after receiving
1083      *                 VEHICLE_AP_POWER_SET_BOOT_COMPLETE, it shall do state transition to
1084      *                 VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE.
1085      */
1086     VEHICLE_AP_POWER_SET_SHUTDOWN_START = 0x5,
1087     /**
1088      * User has requested to turn off headunit's display, which is detected in android side.
1089      * The power controller may change the power state to VEHICLE_AP_POWER_STATE_ON_DISP_OFF.
1090      */
1091     VEHICLE_AP_POWER_SET_DISPLAY_OFF = 0x6,
1092     /**
1093      * User has requested to turn on headunit's display, most probably from power key input which
1094      * is attached to headunit. The power controller may change the power state to
1095      * VEHICLE_AP_POWER_STATE_ON_FULL.
1096      */
1097     VEHICLE_AP_POWER_SET_DISPLAY_ON = 0x7,
1098 };
1099 
1100 /**
1101  * Property to represent brightness of the display. Some cars have single control for
1102  * the brightness of all displays and this property is to share change in that control.
1103  *
1104  * If this is writable, android side can set this value when user changes display brightness
1105  * from Settings. If this is read only, user may still change display brightness from Settings,
1106  * but that will not be reflected to other displays.
1107  *
1108  * @value_type VEHICLE_VALUE_TYPE_INT32
1109  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1110  * @access VEHICLE_PROP_ACCESS_READ|VEHICLE_PROP_ACCESS_READ_WRITE
1111  * @data_member int32
1112  */
1113 #define VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS                         (0x00000A01)
1114 
1115 
1116 /**
1117  * Index in int32_array for VEHICLE_PROPERTY_AP_POWER_STATE property.
1118  */
1119 enum vehicle_ap_power_state_index {
1120     VEHICLE_AP_POWER_STATE_INDEX_STATE = 0,
1121     VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL = 1,
1122 };
1123 
1124 /**
1125 * Property to report bootup reason for the current power on. This is a static property that will
1126 * not change for the whole duration until power off. For example, even if user presses power on
1127 * button after automatic power on with door unlock, bootup reason should stay with
1128 * VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK.
1129 *
1130 * int32_value should be vehicle_ap_power_bootup_reason.
1131 *
1132 * @value_type VEHICLE_VALUE_TYPE_INT32
1133 * @change_mode VEHICLE_PROP_CHANGE_MODE_STATIC
1134 * @access VEHICLE_PROP_ACCESS_READ
1135 * @data_member int32_value
1136 */
1137 #define VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON                     (0x00000A02)
1138 
1139 /**
1140  * Enum to represent bootup reason.
1141  */
1142 enum vehicle_ap_power_bootup_reason {
1143     /**
1144      * Power on due to user's pressing of power key or rotating of ignition switch.
1145      */
1146     VEHICLE_AP_POWER_BOOTUP_REASON_USER_POWER_ON = 0,
1147     /**
1148      * Automatic power on triggered by door unlock or any other kind of automatic user detection.
1149      */
1150     VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK   = 1,
1151     /**
1152      * Automatic power on triggered by timer. This only happens when AP has asked wake-up after
1153      * certain time through time specified in VEHICLE_AP_POWER_SET_SHUTDOWN_START.
1154      */
1155     VEHICLE_AP_POWER_BOOTUP_REASON_TIMER         = 2,
1156 };
1157 
1158 
1159 /**
1160  * Property to feed H/W input events to android
1161  *
1162  * int32_array[0] : action defined by vehicle_hw_key_input_action
1163  * int32_array[1] : key code, should use standard android key code
1164  * int32_array[2] : target display defined in vehicle_display. Events not tied
1165  *                  to specific display should be sent to DISPLAY_MAIN.
1166  * int32_array[3] : reserved for now. should be zero
1167  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4
1168  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1169  * @access VEHICLE_PROP_ACCESS_READ
1170  * @config_flags
1171  * @data_member int32_array
1172  */
1173 #define VEHICLE_PROPERTY_HW_KEY_INPUT                               (0x00000A10)
1174 
1175 enum vehicle_hw_key_input_action {
1176     /** Key down */
1177     VEHICLE_HW_KEY_INPUT_ACTION_DOWN = 0,
1178     /** Key up */
1179     VEHICLE_HW_KEY_INPUT_ACTION_UP = 1,
1180 };
1181 
1182 enum vehicle_display {
1183     /** center console */
1184     VEHICLE_DISPLAY_MAIN               = 0,
1185     VEHICLE_DISPLAY_INSTRUMENT_CLUSTER = 1,
1186 };
1187 
1188 /**
1189  * Property to define instrument cluster information.
1190  * For CLUSTER_TYPE_EXTERNAL_DISPLAY:
1191  *  READ:
1192  *   int32_array[0] : The current screen mode index. Screen mode is defined
1193  *                     as a configuration in car service and represents which
1194  *                     area of screen is renderable.
1195  *   int32_array[1] : Android can render to instrument cluster (=1) or not(=0). When this is 0,
1196  *                    instrument cluster may be rendering some information in the area
1197  *                    allocated for android and android side rendering is invisible. *
1198  *   int32_array[2..3] : should be zero
1199  *  WRITE from android:
1200  *   int32_array[0] : Preferred mode for android side. Depending on the app rendering to instrument
1201  *                    cluster, preferred mode can change. Instrument cluster still needs to send
1202  *                    event with new mode to trigger actual mode change.
1203  *   int32_array[1] : The current app context relevant for instrument cluster. Use the same flag
1204  *                    with vehicle_audio_context_flag but this context represents active apps, not
1205  *                    active audio. Instrument cluster side may change mode depending on the
1206  *                    currently active contexts.
1207  *   int32_array[2..3] : should be zero
1208  *  When system boots up, Android side will write {0, 0, 0, 0} when it is ready to render to
1209  *  instrument cluster. Before this message, rendering from android should not be visible in the
1210  *  cluster.
1211  * @value_type VEHICLE_VALUE_TYPE_INT32_VEC4
1212  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1213  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1214  * @config_array 0:vehicle_instument_cluster_type 1:hw type
1215  * @data_member int32_array
1216  */
1217 #define VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO                    (0x00000A20)
1218 
1219 /**
1220  * Represents instrument cluster type available in system
1221  */
1222 enum vehicle_instument_cluster_type {
1223     /** Android has no access to instument cluster */
1224     VEHICLE_INSTRUMENT_CLUSTER_TYPE_NONE = 0,
1225     /**
1226      * Instrument cluster can communicate through vehicle hal with additional
1227      * properties to exchange meta-data
1228      */
1229     VEHICLE_INSTRUMENT_CLUSTER_TYPE_HAL_INTERFACE = 1,
1230     /**
1231      * Instrument cluster is external display where android can render contents
1232      */
1233     VEHICLE_INSTRUMENT_CLUSTER_TYPE_EXTERNAL_DISPLAY = 2,
1234 };
1235 
1236 /**
1237  * Current date and time, encoded as Unix time.
1238  * This value denotes the number of seconds that have elapsed since 1/1/1970.
1239  *
1240  * @value_type VEHICLE_VALUE_TYPE_INT64
1241  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_SET
1242  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1243  * @data_member int64_value
1244  * @unit VEHICLE_UNIT_TYPE_SECS
1245  */
1246 #define VEHICLE_PROPERTY_UNIX_TIME                                  (0x00000A30)
1247 
1248 /**
1249  * Current time only.
1250  * Some vehicles may not keep track of date.  This property only affects the current time, in
1251  * seconds during the day.  Thus, the max value for this parameter is 86,400 (24 * 60 * 60)
1252  *
1253  * @value_type VEHICLE_VALUE_TYPE_INT32
1254  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_SET
1255  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1256  * @data_member int32_value
1257  * @unit VEHICLE_UNIT_TYPE_SECS
1258  */
1259 #define VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS                    (0x00000A31)
1260 
1261 
1262 //==== Car Cabin Properties ====
1263 /**
1264  * Most Car Cabin properties have both a MOVE and POSITION parameter associated with them.
1265  *
1266  * The MOVE parameter will start moving the device in the indicated direction.  The magnitude
1267  * indicates the relative speed.  For instance, setting the WINDOW_MOVE parameter to +1 will roll
1268  * the window up.  Setting it to +2 (if available) will roll it up faster.
1269  *
1270  * The POSITION parameter will move the device to the desired position.  For instance, if the
1271  * WINDOW_POS has a range of 0-100, then setting this parameter to 50 will open the window halfway.
1272  * Depending upon the initial position, the window may move up or down to the 50% value.
1273  *
1274  * OEMs may choose to implement one or both of the MOVE/POSITION parameters depending upon the
1275  * capability of the hardware.
1276  */
1277 
1278 // Doors
1279 /**
1280  * Door position
1281  *
1282  * This is an integer in case a door may be set to a particular position.  Max
1283  * value indicates fully open, min value (0) indicates fully closed.
1284  *
1285  * Some vehicles (minivans) can open the door electronically.  Hence, the ability
1286  * to write this property.
1287  *
1288  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1289  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1290  * @access VEHICLE_PROP_ACCESS_READ|VEHICLE_PROP_ACCESS_WRITE
1291  * @zone_type VEHICLE_ZONE_TYPE_DOOR
1292  * @data_member int32_value
1293  */
1294 #define VEHICLE_PROPERTY_DOOR_POS                                   (0x00000B00)
1295 
1296 /**
1297  * Door move
1298  *
1299  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1300  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1301  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1302  * @zone_type VEHICLE_ZONE_TYPE_DOOR
1303  * @data_member int32_value
1304  */
1305 #define VEHICLE_PROPERTY_DOOR_MOVE                                  (0x00000B01)
1306 
1307 
1308 /**
1309  * Door lock
1310  *
1311  * 'true' indicates door is locked
1312  *
1313  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
1314  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1315  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1316  * @zone_type VEHICLE_ZONE_TYPE_DOOR
1317  * @data_member boolean_value
1318  */
1319 #define VEHICLE_PROPERTY_DOOR_LOCK                                  (0x00000B02)
1320 
1321 // Mirrors
1322 /**
1323  * Mirror Z Position
1324  *
1325  * Positive value indicates tilt upwards, negative value is downwards
1326  *
1327  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1328  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1329  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1330  * @zone_type VEHICLE_ZONE_TYPE_MIRROR
1331  * @data_member int32_value
1332  */
1333 #define VEHICLE_PROPERTY_MIRROR_Z_POS                               (0x00000B40)
1334 
1335 /**
1336  * Mirror Z Move
1337  *
1338  * Positive value indicates tilt upwards, negative value is downwards
1339  *
1340  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1341  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1342  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1343  * @zone_type VEHICLE_ZONE_TYPE_MIRROR
1344  * @data_member int32_value
1345  */
1346 #define VEHICLE_PROPERTY_MIRROR_Z_MOVE                              (0x00000B41)
1347 
1348 /**
1349  * Mirror Y Position
1350  *
1351  * Positive value indicate tilt right, negative value is left
1352  *
1353  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1354  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1355  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1356  * @zone_type VEHICLE_ZONE_TYPE_MIRROR
1357  * @data_member int32_value
1358  */
1359 #define VEHICLE_PROPERTY_MIRROR_Y_POS                               (0x00000B42)
1360 
1361 /**
1362  * Mirror Y Move
1363  *
1364  * Positive value indicate tilt right, negative value is left
1365  *
1366  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1367  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1368  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1369  * @zone_type VEHICLE_ZONE_TYPE_MIRROR
1370  * @data_member int32_value
1371  */
1372 #define VEHICLE_PROPERTY_MIRROR_Y_MOVE                              (0x00000B43)
1373 
1374 /**
1375  * Mirror Lock
1376  *
1377  * True indicates mirror positions are locked and not changeable
1378  *
1379  * @value_type VEHICLE_VALUE_TYPE_BOOLEAN
1380  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1381  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1382  * @data_member boolean_value
1383  */
1384 #define VEHICLE_PROPERTY_MIRROR_LOCK                                (0x00000B44)
1385 
1386 /**
1387  * Mirror Fold
1388  *
1389  * True indicates mirrors are folded
1390  *
1391  * @value_type VEHICLE_VALUE_TYPE_BOOLEAN
1392  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1393  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1394  * @data_member boolean_value
1395  */
1396 #define VEHICLE_PROPERTY_MIRROR_FOLD                                (0x00000B45)
1397 
1398 // Seats
1399 /**
1400  * Seat memory select
1401  *
1402  * This parameter selects the memory preset to use to select the seat position.
1403  * The minValue is always 0, and the maxValue determines the number of seat
1404  * positions available.
1405  *
1406  * For instance, if the driver's seat has 3 memory presets, the maxValue will be 3.
1407  * When the user wants to select a preset, the desired preset number (1, 2, or 3)
1408  * is set.
1409  *
1410  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1411  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1412  * @access VEHICLE_PROP_ACCESS_WRITE
1413  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1414  * @data_member int32_value
1415  */
1416 #define VEHICLE_PROPERTY_SEAT_MEMORY_SELECT                         (0x00000B80)
1417 
1418 /**
1419  * Seat memory set
1420  *
1421  * This setting allows the user to save the current seat position settings into
1422  * the selected preset slot.  The maxValue for each seat position shall match
1423  * the maxValue for VEHICLE_PROPERTY_SEAT_MEMORY_SELECT.
1424  *
1425  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1426  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1427  * @access VEHICLE_PROP_ACCESS_WRITE
1428  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1429  * @data_member int32_value
1430  */
1431 #define VEHICLE_PROPERTY_SEAT_MEMORY_SET                            (0x00000B81)
1432 
1433 /**
1434  * Seatbelt buckled
1435  *
1436  * True indicates belt is buckled.
1437  *
1438  * Write access indicates automatic seat buckling capabilities.  There are no known cars at this
1439  * time, but you never know...
1440  *
1441  * @value_type VEHICLE_VALUE_TYPE_ZONED_BOOLEAN
1442  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1443  * @access VEHICLE_PROP_ACCESS_READ|VEHICLE_PROP_ACCESS_WRITE
1444  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1445  * @data_member boolean_value
1446  */
1447 #define VEHICLE_PROPERTY_SEAT_BELT_BUCKLED                          (0x00000B82)
1448 
1449 /**
1450  * Seatbelt height position
1451  *
1452  * Adjusts the shoulder belt anchor point.
1453  * Max value indicates highest position
1454  * Min value indicates lowest position
1455  *
1456  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1457  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1458  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1459  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1460  * @data_member int32_value
1461  */
1462 #define VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS                       (0x00000B83)
1463 
1464 /**
1465  * Seatbelt height move
1466  *
1467  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1468  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1469  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1470  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1471  * @data_member int32_value
1472  */
1473 #define VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE                      (0x00000B84)
1474 
1475 /**
1476  * Seat fore/aft position
1477  *
1478  * Sets the seat position forward (closer to steering wheel) and backwards.
1479  * Max value indicates closest to wheel, min value indicates most rearward
1480  * position.
1481  *
1482  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1483  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1484  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1485  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1486  * @data_member int32_value
1487  */
1488 #define VEHICLE_PROPERTY_SEAT_FORE_AFT_POS                          (0x00000B85)
1489 
1490 /**
1491  * Seat fore/aft move
1492  *
1493  * Moves the seat position forward and aft.
1494  *
1495  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1496  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1497  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1498  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1499  * @data_member int32_value
1500  */
1501 #define VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE                         (0x00000B86)
1502 
1503 /**
1504  * Seat backrest angle 1 position
1505  *
1506  * Backrest angle 1 is the actuator closest to the bottom of the seat.
1507  * Max value indicates angling forward towards the steering wheel.
1508  * Min value indicates full recline.
1509  *
1510  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1511  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1512  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1513  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1514  * @data_member int32_value
1515  */
1516 #define VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS                  (0x00000B87)
1517 
1518 /**
1519  * Seat backrest angle 1 move
1520  *
1521  * Moves the backrest forward or recline.
1522  *
1523  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1524  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1525  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1526  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1527  * @data_member int32_value
1528  */
1529 #define VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE                 (0x00000B88)
1530 
1531 /**
1532  * Seat backrest angle 2 position
1533  *
1534  * Backrest angle 2 is the next actuator up from the bottom of the seat.
1535  * Max value indicates angling forward towards the steering wheel.
1536  * Min value indicates full recline.
1537  *
1538  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1539  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1540  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1541  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1542  * @data_member int32_value
1543  */
1544 #define VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS                  (0x00000B89)
1545 
1546 /**
1547  * Seat backrest angle 2 move
1548  *
1549  * Moves the backrest forward or recline.
1550  *
1551  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1552  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1553  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1554  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1555  * @data_member int32_value
1556  */
1557 #define VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE                 (0x00000B8A)
1558 
1559 /**
1560  * Seat height position
1561  *
1562  * Sets the seat height.
1563  * Max value indicates highest position.
1564  * Min value indicates lowest position.
1565  *
1566  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1567  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1568  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1569  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1570  * @data_member int32_value
1571  */
1572 #define VEHICLE_PROPERTY_SEAT_HEIGHT_POS                            (0x00000B8B)
1573 
1574 /**
1575  * Seat height move
1576  *
1577  * Moves the seat height.
1578  *
1579  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1580  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1581  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1582  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1583  * @data_member int32_value
1584  */
1585 #define VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE                           (0x00000B8C)
1586 
1587 /**
1588  * Seat depth position
1589  *
1590  * Sets the seat depth, distance from back rest to front edge of seat.
1591  * Max value indicates longest depth position.
1592  * Min value indicates shortest position.
1593  *
1594  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1595  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1596  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1597  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1598  * @data_member int32_value
1599  */
1600 #define VEHICLE_PROPERTY_SEAT_DEPTH_POS                             (0x00000B8D)
1601 
1602 /**
1603  * Seat depth move
1604  *
1605  * Adjusts the seat depth.
1606  *
1607  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1608  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1609  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1610  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1611  * @data_member int32_value
1612  */
1613 #define VEHICLE_PROPERTY_SEAT_DEPTH_MOVE                            (0x00000B8E)
1614 
1615 /**
1616  * Seat tilt position
1617  *
1618  * Sets the seat tilt.
1619  * Max value indicates front edge of seat higher than back edge.
1620  * Min value indicates front edge of seat lower than back edge.
1621  *
1622  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1623  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1624  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1625  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1626  * @data_member int32_value
1627  */
1628 #define VEHICLE_PROPERTY_SEAT_TILT_POS                              (0x00000B8F)
1629 
1630 /**
1631  * Seat tilt move
1632  *
1633  * Tilts the seat.
1634  *
1635  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1636  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1637  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1638  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1639  * @data_member int32_value
1640  */
1641 #define VEHICLE_PROPERTY_SEAT_TILT_MOVE                             (0x00000B90)
1642 
1643 /**
1644  * Lumber fore/aft position
1645  *
1646  * Pushes the lumbar support forward and backwards
1647  * Max value indicates most forward position.
1648  * Min value indicates most rearward position.
1649  *
1650  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1651  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1652  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1653  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1654  * @data_member int32_value
1655  */
1656 #define VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS                   (0x00000B91)
1657 
1658 /**
1659  * Lumbar fore/aft move
1660  *
1661  * Adjusts the lumbar support.
1662  *
1663  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1664  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1665  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1666  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1667  * @data_member int32_value
1668  */
1669 #define VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE                  (0x00000B92)
1670 
1671 /**
1672  * Lumbar side support position
1673  *
1674  * Sets the amount of lateral lumbar support.
1675  * Max value indicates widest lumbar setting (i.e. least support)
1676  * Min value indicates thinnest lumbar setting.
1677  *
1678  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1679  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1680  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1681  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1682  * @data_member int32_value
1683  */
1684 #define VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS               (0x00000B93)
1685 
1686 /**
1687  * Lumbar side support move
1688  *
1689  * Adjusts the amount of lateral lumbar support.
1690  *
1691  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1692  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1693  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1694  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1695  * @data_member int32_value
1696  */
1697 #define VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE              (0x00000B94)
1698 
1699 /**
1700  * Headrest height position
1701  *
1702  * Sets the headrest height.
1703  * Max value indicates tallest setting.
1704  * Min value indicates shortest setting.
1705  *
1706  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1707  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1708  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1709  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1710  * @data_member int32_value
1711  */
1712 #define VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS                   (0x00000B95)
1713 
1714 /**
1715  * Headrest height move
1716  *
1717  * Moves the headrest up and down.
1718  *
1719  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1720  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1721  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1722  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1723  * @data_member int32_value
1724  */
1725 #define VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE                  (0x00000B96)
1726 
1727 /**
1728  * Headrest angle position
1729  *
1730  * Sets the angle of the headrest.
1731  * Max value indicates most upright angle.
1732  * Min value indicates shallowest headrest angle.
1733  *
1734  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1735  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1736  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1737  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1738  * @data_member int32_value
1739  */
1740 #define VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS                    (0x00000B97)
1741 
1742 /**
1743  * Headrest angle move
1744  *
1745  * Adjusts the angle of the headrest
1746  *
1747  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1748  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1749  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1750  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1751  * @data_member int32_value
1752  */
1753 #define VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE                   (0x00000B98)
1754 
1755 /**
1756  * Headrest fore/aft position
1757  *
1758  * Adjusts the headrest forwards and backwards.
1759  * Max value indicates position closest to front of car.
1760  * Min value indicates position closest to rear of car.
1761  *
1762  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1763  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1764  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1765  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1766  * @data_member int32_value
1767  */
1768 #define VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS                 (0x00000B99)
1769 
1770 /**
1771  * Headrest fore/aft move
1772  *
1773  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1774  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1775  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1776  * @zone_type VEHICLE_ZONE_TYPE_SEAT
1777  * @data_member int32_value
1778  */
1779 #define VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE                (0x00000B9A)
1780 
1781 
1782 // Windows
1783 /**
1784  * Window Position
1785  *
1786  * Max = window up / closed
1787  * Min = window down / open
1788  *
1789  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1790  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1791  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1792  * @data_member int32_value
1793  */
1794 #define VEHICLE_PROPERTY_WINDOW_POS                                 (0x00000BC0)
1795 
1796 /**
1797  * Window Move
1798  *
1799  * Max = window up / closed
1800  * Min = window down / open
1801  * Magnitude denotes relative speed.  I.e. +2 is faster than +1 in raising the window.
1802  *
1803  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1804  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1805  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1806  * @data_member int32_value
1807  */
1808 #define VEHICLE_PROPERTY_WINDOW_MOVE                                (0x00000BC1)
1809 
1810 /**
1811  * Window Vent Position
1812  *
1813  * This feature is used to control the vent feature on a sunroof.
1814  *
1815  * Max = vent open
1816  * Min = vent closed
1817  *
1818  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1819  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1820  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1821  * @data_member int32_value
1822  */
1823 #define VEHICLE_PROPERTY_WINDOW_VENT_POS                            (0x00000BC2)
1824 
1825 /**
1826  * Window Vent Move
1827  *
1828  * This feature is used to control the vent feature on a sunroof.
1829  *
1830  * Max = vent open
1831  * Min = vent closed
1832  *
1833  * @value_type VEHICLE_VALUE_TYPE_ZONED_INT32
1834  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1835  * @access VEHICLE_PROP_ACCESS_READ_WRITE|VEHICLE_PROP_ACCESS_WRITE
1836  * @data_member int32_value
1837  */
1838 #define VEHICLE_PROPERTY_WINDOW_VENT_MOVE                           (0x00000BC3)
1839 
1840 /**
1841  * Window Lock
1842  *
1843  * True indicates windows are locked and can't be moved.
1844  *
1845  * @value_type VEHICLE_VALUE_TYPE_BOOLEAN
1846  * @change_mode VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
1847  * @access VEHICLE_PROP_ACCESS_READ_WRITE
1848  * @data_member boolean_value
1849  */
1850 #define VEHICLE_PROPERTY_WINDOW_LOCK                                (0x00000BC4)
1851 
1852 
1853 
1854 /**
1855  *  H/W specific, non-standard property can be added as necessary. Such property should use
1856  *  property number in range of [VEHICLE_PROPERTY_CUSTOM_START, VEHICLE_PROPERTY_CUSTOM_END].
1857  *  Definition of property in this range is completely up to each HAL implementation.
1858  *  For such property, it is recommended to fill vehicle_prop_config.config_string with some
1859  *  additional information to help debugging. For example, company XYZ's custom extension may
1860  *  include config_string of "com.XYZ.some_further_details".
1861  *  @range_start
1862  */
1863 #define VEHICLE_PROPERTY_CUSTOM_START                               (0x70000000)
1864 /** @range_end */
1865 #define VEHICLE_PROPERTY_CUSTOM_END                                 (0x73ffffff)
1866 
1867 /**
1868  * Property range allocated for system's internal usage like testing. HAL should never declare
1869  * property in this range.
1870  * @range_start
1871  */
1872 #define VEHICLE_PROPERTY_INTERNAL_START                             (0x74000000)
1873 /**
1874  * @range_end
1875  */
1876 #define VEHICLE_PROPERTY_INTERNAL_END                               (0x74ffffff)
1877 
1878 /**
1879  * Value types for various properties.
1880  */
1881 enum vehicle_value_type {
1882     VEHICLE_VALUE_TYPE_SHOUD_NOT_USE            = 0x00, // value_type should never set to 0.
1883     VEHICLE_VALUE_TYPE_STRING                   = 0x01,
1884     VEHICLE_VALUE_TYPE_BYTES                    = 0x02,
1885     VEHICLE_VALUE_TYPE_BOOLEAN                  = 0x03,
1886     VEHICLE_VALUE_TYPE_ZONED_BOOLEAN            = 0x04,
1887     VEHICLE_VALUE_TYPE_INT64                    = 0x05,
1888     VEHICLE_VALUE_TYPE_FLOAT                    = 0x10,
1889     VEHICLE_VALUE_TYPE_FLOAT_VEC2               = 0x11,
1890     VEHICLE_VALUE_TYPE_FLOAT_VEC3               = 0x12,
1891     VEHICLE_VALUE_TYPE_FLOAT_VEC4               = 0x13,
1892     VEHICLE_VALUE_TYPE_INT32                    = 0x20,
1893     VEHICLE_VALUE_TYPE_INT32_VEC2               = 0x21,
1894     VEHICLE_VALUE_TYPE_INT32_VEC3               = 0x22,
1895     VEHICLE_VALUE_TYPE_INT32_VEC4               = 0x23,
1896     VEHICLE_VALUE_TYPE_ZONED_FLOAT              = 0x30,
1897     VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2         = 0x31,
1898     VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3         = 0x32,
1899     VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4         = 0x33,
1900     VEHICLE_VALUE_TYPE_ZONED_INT32              = 0x40,
1901     VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2         = 0x41,
1902     VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3         = 0x42,
1903     VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4         = 0x43,
1904 };
1905 
1906 /**
1907  * Units used for int or float type with no attached enum types.
1908  */
1909 enum vehicle_unit_type {
1910     VEHICLE_UNIT_TYPE_SHOULD_NOT_USE        = 0x00000000,
1911     // speed related items
1912     VEHICLE_UNIT_TYPE_METER_PER_SEC         = 0x00000001,
1913     VEHICLE_UNIT_TYPE_RPM                   = 0x00000002,
1914     VEHICLE_UNIT_TYPE_HZ                    = 0x00000003,
1915     // kind of ratio
1916     VEHICLE_UNIT_TYPE_PERCENTILE            = 0x00000010,
1917     // length
1918     VEHICLE_UNIT_TYPE_MILLIMETER            = 0x00000020,
1919     VEHICLE_UNIT_TYPE_METER                 = 0x00000021,
1920     VEHICLE_UNIT_TYPE_KILOMETER             = 0x00000023,
1921     // temperature
1922     VEHICLE_UNIT_TYPE_CELSIUS               = 0x00000030,
1923     VEHICLE_UNIT_TYPE_FAHRENHEIT            = 0x00000031,
1924     VEHICLE_UNIT_TYPE_KELVIN                = 0x00000032,
1925     // volume
1926     VEHICLE_UNIT_TYPE_MILLILITER            = 0x00000040,
1927     // time
1928     VEHICLE_UNIT_TYPE_NANO_SECS             = 0x00000050,
1929     VEHICLE_UNIT_TYPE_SECS                  = 0x00000053,
1930     VEHICLE_UNIT_TYPE_YEAR                  = 0x00000059,
1931 };
1932 
1933 /**
1934  * This describes how value of property can change.
1935  */
1936 enum vehicle_prop_change_mode {
1937     /**
1938      * Property of this type will *never* change. This property will not support subscription, but
1939      * will support get
1940      */
1941     VEHICLE_PROP_CHANGE_MODE_STATIC         = 0x00,
1942     /**
1943      * Property of this type will be reported when there is a change.
1944      * get call should return the current value.
1945      * Set operation for this property is assumed to be asynchronous. When the property is read
1946      * (get) after set, it may still return old value until underlying H/W backing this property
1947      * has actually changed the state. Once state is changed, the property will dispatch changed
1948      * value as event.
1949      */
1950     VEHICLE_PROP_CHANGE_MODE_ON_CHANGE      = 0x01,
1951     /**
1952      * Property of this type change continuously and requires fixed rate of sampling to retrieve
1953      * the data.
1954      */
1955     VEHICLE_PROP_CHANGE_MODE_CONTINUOUS     = 0x02,
1956     /**
1957      * Property of this type may be polled to get the current value.
1958      */
1959     VEHICLE_PROP_CHANGE_MODE_POLL           = 0x03,
1960     /**
1961      * This is for property where change event should be sent only when the value is
1962      * set from external component. Normal value change will not trigger event.
1963      * For example, clock property can send change event only when it is set, outside android,
1964      * for case like user setting time or time getting update. There is no need to send it
1965      * per every value change.
1966      */
1967     VEHICLE_PROP_CHANGE_MODE_ON_SET         = 0x04,
1968 };
1969 
1970 /**
1971  * Property config defines the capabilities of it. User of the API
1972  * should first get the property config to understand the output from get()
1973  * commands and also to ensure that set() or events commands are in sync with
1974  * the expected output.
1975  */
1976 enum vehicle_prop_access {
1977     VEHICLE_PROP_ACCESS_READ  = 0x01,
1978     VEHICLE_PROP_ACCESS_WRITE = 0x02,
1979     VEHICLE_PROP_ACCESS_READ_WRITE = 0x03
1980 };
1981 
1982 /**
1983  * These permissions define how the OEMs want to distribute their information and security they
1984  * want to apply. On top of these restrictions, android will have additional
1985  * 'app-level' permissions that the apps will need to ask the user before the apps have the
1986  * information.
1987  * This information should be kept in vehicle_prop_config.permission_model.
1988  */
1989 enum vehicle_permission_model {
1990     /**
1991      * No special restriction, but each property can still require specific android app-level
1992      * permission.
1993      */
1994     VEHICLE_PERMISSION_NO_RESTRICTION = 0,
1995     /** Signature only. Only APKs signed with OEM keys are allowed. */
1996     VEHICLE_PERMISSION_OEM_ONLY = 0x1,
1997     /** System only. APKs built-in to system  can access the property. */
1998     VEHICLE_PERMISSION_SYSTEM_APP_ONLY = 0x2,
1999     /** Equivalent to “system|signature” */
2000     VEHICLE_PERMISSION_OEM_OR_SYSTEM_APP = 0x3
2001 };
2002 
2003 
2004 /**
2005  *  Special values for INT32/FLOAT (including ZONED types)
2006  *  These values represent special state, which is outside MIN/MAX range but can happen.
2007  *  For example, HVAC temperature may use out of range min / max to represent that
2008  *  it is working in full power although target temperature has separate min / max.
2009  *  OUT_OF_RANGE_OFF can represent a state where the property is powered off.
2010  *  Usually such property will have separate property to control power.
2011  */
2012 
2013 #define VEHICLE_INT_OUT_OF_RANGE_MAX (INT32_MAX)
2014 #define VEHICLE_INT_OUT_OF_RANGE_MIN (INT32_MIN)
2015 #define VEHICLE_INT_OUT_OF_RANGE_OFF (INT32_MIN + 1)
2016 
2017 #define VEHICLE_FLOAT_OUT_OF_RANGE_MAX (INFINITY)
2018 #define VEHICLE_FLOAT_OUT_OF_RANGE_MIN (-INFINITY)
2019 #define VEHICLE_FLOAT_OUT_OF_RANGE_OFF (NAN)
2020 
2021 /**
2022  * Car states.
2023  *
2024  * The driving states determine what features of the UI will be accessible.
2025  */
2026 enum vehicle_driving_status {
2027     VEHICLE_DRIVING_STATUS_UNRESTRICTED      = 0x00,
2028     VEHICLE_DRIVING_STATUS_NO_VIDEO          = 0x01,
2029     VEHICLE_DRIVING_STATUS_NO_KEYBOARD_INPUT = 0x02,
2030     VEHICLE_DRIVING_STATUS_NO_VOICE_INPUT    = 0x04,
2031     VEHICLE_DRIVING_STATUS_NO_CONFIG         = 0x08,
2032     VEHICLE_DRIVING_STATUS_LIMIT_MESSAGE_LEN = 0x10
2033 };
2034 
2035 /**
2036  * Various gears which can be selected by user and chosen in system.
2037  */
2038 enum vehicle_gear {
2039     // Gear selections present in both automatic and manual cars.
2040     VEHICLE_GEAR_NEUTRAL    = 0x0001,
2041     VEHICLE_GEAR_REVERSE    = 0x0002,
2042 
2043     // Gear selections (mostly) present only in automatic cars.
2044     VEHICLE_GEAR_PARK       = 0x0004,
2045     VEHICLE_GEAR_DRIVE      = 0x0008,
2046     VEHICLE_GEAR_LOW        = 0x0010,
2047 
2048     // Other possible gear selections (maybe present in manual or automatic
2049     // cars).
2050     VEHICLE_GEAR_1          = 0x0010,
2051     VEHICLE_GEAR_2          = 0x0020,
2052     VEHICLE_GEAR_3          = 0x0040,
2053     VEHICLE_GEAR_4          = 0x0080,
2054     VEHICLE_GEAR_5          = 0x0100,
2055     VEHICLE_GEAR_6          = 0x0200,
2056     VEHICLE_GEAR_7          = 0x0400,
2057     VEHICLE_GEAR_8          = 0x0800,
2058     VEHICLE_GEAR_9          = 0x1000
2059 };
2060 
2061 
2062 /**
2063  * Various zones in the car.
2064  *
2065  * Zones are used for Air Conditioning purposes and divide the car into physical
2066  * area zones.
2067  */
2068 enum vehicle_zone {
2069     VEHICLE_ZONE_ROW_1_LEFT    = 0x00000001,
2070     VEHICLE_ZONE_ROW_1_CENTER  = 0x00000002,
2071     VEHICLE_ZONE_ROW_1_RIGHT   = 0x00000004,
2072     VEHICLE_ZONE_ROW_1_ALL     = 0x00000008,
2073     VEHICLE_ZONE_ROW_2_LEFT    = 0x00000010,
2074     VEHICLE_ZONE_ROW_2_CENTER  = 0x00000020,
2075     VEHICLE_ZONE_ROW_2_RIGHT   = 0x00000040,
2076     VEHICLE_ZONE_ROW_2_ALL     = 0x00000080,
2077     VEHICLE_ZONE_ROW_3_LEFT    = 0x00000100,
2078     VEHICLE_ZONE_ROW_3_CENTER  = 0x00000200,
2079     VEHICLE_ZONE_ROW_3_RIGHT   = 0x00000400,
2080     VEHICLE_ZONE_ROW_3_ALL     = 0x00000800,
2081     VEHICLE_ZONE_ROW_4_LEFT    = 0x00001000,
2082     VEHICLE_ZONE_ROW_4_CENTER  = 0x00002000,
2083     VEHICLE_ZONE_ROW_4_RIGHT   = 0x00004000,
2084     VEHICLE_ZONE_ROW_4_ALL     = 0x00008000,
2085     VEHICLE_ZONE_ALL           = 0x80000000,
2086 };
2087 
2088 /**
2089  * Various Seats in the car.
2090  */
2091 enum vehicle_seat {
2092     VEHICLE_SEAT_ROW_1_LEFT   = 0x0001,
2093     VEHICLE_SEAT_ROW_1_CENTER = 0x0002,
2094     VEHICLE_SEAT_ROW_1_RIGHT  = 0x0004,
2095     VEHICLE_SEAT_ROW_2_LEFT   = 0x0010,
2096     VEHICLE_SEAT_ROW_2_CENTER = 0x0020,
2097     VEHICLE_SEAT_ROW_2_RIGHT  = 0x0040,
2098     VEHICLE_SEAT_ROW_3_LEFT   = 0x0100,
2099     VEHICLE_SEAT_ROW_3_CENTER = 0x0200,
2100     VEHICLE_SEAT_ROW_3_RIGHT  = 0x0400
2101 };
2102 
2103 /**
2104  * Various windshields/windows in the car.
2105  */
2106 enum vehicle_window {
2107     VEHICLE_WINDOW_FRONT_WINDSHIELD = 0x0001,
2108     VEHICLE_WINDOW_REAR_WINDSHIELD  = 0x0002,
2109     VEHICLE_WINDOW_ROOF_TOP         = 0x0004,
2110     VEHICLE_WINDOW_ROW_1_LEFT       = 0x0010,
2111     VEHICLE_WINDOW_ROW_1_RIGHT      = 0x0020,
2112     VEHICLE_WINDOW_ROW_2_LEFT       = 0x0100,
2113     VEHICLE_WINDOW_ROW_2_RIGHT      = 0x0200,
2114     VEHICLE_WINDOW_ROW_3_LEFT       = 0x1000,
2115     VEHICLE_WINDOW_ROW_3_RIGHT      = 0x2000,
2116 };
2117 
2118 enum vehicle_door {
2119     VEHICLE_DOOR_ROW_1_LEFT    = 0x00000001,
2120     VEHICLE_DOOR_ROW_1_RIGHT   = 0x00000004,
2121     VEHICLE_DOOR_ROW_2_LEFT    = 0x00000010,
2122     VEHICLE_DOOR_ROW_2_RIGHT   = 0x00000040,
2123     VEHICLE_DOOR_ROW_3_LEFT    = 0x00000100,
2124     VEHICLE_DOOR_ROW_3_RIGHT   = 0x00000400,
2125     VEHICLE_DOOR_HOOD          = 0x10000000,
2126     VEHICLE_DOOR_REAR          = 0x20000000,
2127 };
2128 
2129 enum vehicle_mirror {
2130     VEHICLE_MIRROR_DRIVER_LEFT   = 0x00000001,
2131     VEHICLE_MIRROR_DRIVER_RIGHT  = 0x00000002,
2132     VEHICLE_MIRROR_DRIVER_CENTER = 0x00000004,
2133 };
2134 
2135 enum vehicle_turn_signal {
2136     VEHICLE_SIGNAL_NONE         = 0x00,
2137     VEHICLE_SIGNAL_RIGHT        = 0x01,
2138     VEHICLE_SIGNAL_LEFT         = 0x02,
2139     VEHICLE_SIGNAL_EMERGENCY    = 0x04
2140 };
2141 
2142 enum vehicle_zone_type {
2143     VEHICLE_ZONE_TYPE_NONE      = 0x00,
2144     VEHICLE_ZONE_TYPE_ZONE    = 0x01,
2145     VEHICLE_ZONE_TYPE_SEAT      = 0x02,
2146     VEHICLE_ZONE_TYPE_DOOR      = 0x04,
2147     VEHICLE_ZONE_TYPE_WINDOW    = 0x10,
2148     VEHICLE_ZONE_TYPE_MIRROR    = 0x20,
2149 };
2150 
2151 /*
2152  * Boolean type.
2153  */
2154 enum vehicle_boolean {
2155     VEHICLE_FALSE = 0x00,
2156     VEHICLE_TRUE  = 0x01
2157 };
2158 
2159 typedef int32_t vehicle_boolean_t;
2160 
2161 /**
2162  * Vehicle string.
2163  *
2164  * Defines a UTF8 encoded sequence of bytes that should be used for string
2165  * representation throughout.
2166  */
2167 typedef struct vehicle_str {
2168     uint8_t* data;
2169     int32_t len;
2170 } vehicle_str_t;
2171 
2172 /**
2173  * Vehicle byte array.
2174  * This is for passing generic raw data.
2175  */
2176 typedef vehicle_str_t vehicle_bytes_t;
2177 
2178 typedef struct vehicle_prop_config {
2179     int32_t prop;
2180 
2181     /**
2182      * Defines if the property is read or write. Value should be one of
2183      * enum vehicle_prop_access.
2184      */
2185     int32_t access;
2186 
2187     /**
2188      * Defines if the property is continuous or on-change. Value should be one
2189      * of enum vehicle_prop_change_mode.
2190      */
2191     int32_t change_mode;
2192 
2193     /**
2194      * Type of data used for this property. This type is fixed per each property.
2195      * Check vehicle_value_type for allowed value.
2196      */
2197     int32_t value_type;
2198 
2199     /**
2200      * Define necessary permission model to access the data.
2201      */
2202     int32_t permission_model;
2203 
2204     /**
2205      * Some of the properties may have associated zones (such as hvac), in these
2206      * cases the config should contain an ORed value for the associated zone.
2207      */
2208     union {
2209         /**
2210          * The value is derived by ORing one or more of enum vehicle_zone members.
2211          */
2212         int32_t vehicle_zone_flags;
2213         /** The value is derived by ORing one or more of enum vehicle_seat members. */
2214         int32_t vehicle_seat_flags;
2215         /** The value is derived by ORing one or more of enum vehicle_window members. */
2216         int32_t vehicle_window_flags;
2217     };
2218 
2219     /**
2220      * Property specific configuration information. Usage of this will be defined per each property.
2221      */
2222     union {
2223         /**
2224          * For generic configuration information
2225          */
2226         int32_t config_flags;
2227         /** The number of presets that are stored by the radio module. Pass 0 if
2228          * there are no presets available. The range of presets is defined to be
2229          * from 1 (see VEHICLE_RADIO_PRESET_MIN_VALUE) to vehicle_radio_num_presets.
2230          */
2231         int32_t vehicle_radio_num_presets;
2232         int32_t config_array[4];
2233     };
2234 
2235     /**
2236      * Some properties may require additional information passed over this string. Most properties
2237      * do not need to set this and in that case, config_string.data should be NULL and
2238      * config_string.len should be 0.
2239      */
2240     vehicle_str_t config_string;
2241 
2242     /**
2243      * Specify minimum allowed value for the property. This is necessary for property which does
2244      * not have specified enum.
2245      */
2246     union {
2247         float float_min_value;
2248         int32_t int32_min_value;
2249         int64_t int64_min_value;
2250     };
2251 
2252     /**
2253      * Specify maximum allowed value for the property. This is necessary for property which does
2254      * not have specified enum.
2255      */
2256     union {
2257         float float_max_value;
2258         int32_t int32_max_value;
2259         int64_t int64_max_value;
2260     };
2261 
2262     /**
2263      * Array of min values for zoned properties. Zoned property can specify min / max value in two
2264      * different ways:
2265      *   1. All zones having the same min / max value: *_min/max_value should be set and this
2266      *      array should be set to NULL.
2267      *   2. All zones having separate min / max value: *_min/max_values array should be populated
2268      *      and its length should be the same as number of active zones specified by *_zone_flags.
2269      *
2270      * Should be NULL if each zone does not have separate max values.
2271      */
2272     union {
2273         float* float_min_values;
2274         int32_t* int32_min_values;
2275         int64_t* int64_min_values;
2276     };
2277 
2278     /**
2279      * Array of max values for zoned properties. See above for its usage.
2280      * Should be NULL if each zone does not have separate max values.
2281      * If not NULL, length of array should match that of min_values.
2282      */
2283     union {
2284         float* float_max_values;
2285         int32_t* int32_max_values;
2286         int64_t* int64_max_values;
2287     };
2288 
2289     /**
2290      * Min sample rate in Hz. Should be 0 for sensor type of VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
2291      */
2292     float min_sample_rate;
2293     /**
2294      * Max sample rate in Hz. Should be 0 for sensor type of VEHICLE_PROP_CHANGE_MODE_ON_CHANGE
2295      */
2296     float max_sample_rate;
2297     /**
2298      * Place holder for putting HAL implementation specific data. Usage is wholly up to HAL
2299      * implementation.
2300      */
2301     void* hal_data;
2302 } vehicle_prop_config_t;
2303 
2304 /**
2305  * HVAC property fields.
2306  *
2307  * Defines various HVAC properties which are packed into vehicle_hvac_t (see
2308  * below). We define these properties outside in global scope so that HAL
2309  * implementation and HAL users (JNI) can typecast vehicle_hvac correctly.
2310  */
2311 typedef struct vehicle_hvac {
2312     /**
2313      * Define one structure for each possible HVAC property.
2314      * NOTES:
2315      * a) Fan speed is a number from (0 - 6) where 6 is the highest speed. (TODO define enum)
2316      * b) Temperature is a floating point Celcius scale.
2317      * c) Direction is defined in enum vehicle_fan_direction.
2318      *
2319      * The HAL should create #entries number of vehicle_hvac_properties and
2320      * assign it to "properties" variable below.
2321      */
2322     union {
2323         int32_t fan_speed;
2324         int32_t fan_direction;
2325         vehicle_boolean_t ac_on;
2326         vehicle_boolean_t max_ac_on;
2327         vehicle_boolean_t max_defrost_on;
2328         vehicle_boolean_t recirc_on;
2329         vehicle_boolean_t dual_on;
2330         vehicle_boolean_t auto_on;
2331         vehicle_boolean_t power_on;
2332 
2333         float temperature_current;
2334         float temperature_set;
2335 
2336         vehicle_boolean_t defrost_on;
2337     };
2338 } vehicle_hvac_t;
2339 
2340 /*
2341  * Defines how the values for various properties are represented.
2342  *
2343  * There are two ways to populate and access the fields:
2344  * a) Using the individual fields. Use this mechanism (see
2345  * info_manufacture_date, fuel_capacity fields etc).
2346  * b) Using the union accessors (see uint32_value, float_value etc).
2347  *
2348  * To add a new field make sure that it does not exceed the total union size
2349  * (defined in int_array) and it is one of the vehicle_value_type. Then add the
2350  * field name with its unit to union. If the field type is not yet defined (as
2351  * of this draft, we don't use int64_t) then add that type to vehicle_value_type
2352  * and have an accessor (so for int64_t it will be int64_t int64_value).
2353  */
2354 typedef union vehicle_value {
2355     /** Define the max size of this structure. */
2356     int32_t int32_array[4];
2357     float float_array[4];
2358 
2359     // Easy accessors for union members (HAL implementation SHOULD NOT USE these
2360     // fields while populating, use the property specific fields below instead).
2361     int32_t int32_value;
2362     int64_t int64_value;
2363     float float_value;
2364     vehicle_str_t str_value;
2365     vehicle_bytes_t bytes_value;
2366     vehicle_boolean_t boolean_value;
2367 
2368     // Vehicle Information.
2369     vehicle_str_t info_vin;
2370     vehicle_str_t info_make;
2371     vehicle_str_t info_model;
2372     int32_t info_model_year;
2373 
2374     // Represented in milliliters.
2375     float info_fuel_capacity;
2376 
2377     float vehicle_speed;
2378     float odometer;
2379 
2380     // Engine sensors.
2381 
2382     // Represented in milliliters.
2383     //float engine_coolant_level;
2384     // Represented in celcius.
2385     float engine_coolant_temperature;
2386     // Represented in a percentage value.
2387     //float engine_oil_level;
2388     // Represented in celcius.
2389     float engine_oil_temperature;
2390     float engine_rpm;
2391 
2392     // Event sensors.
2393     // Value should be one of enum vehicle_gear_selection.
2394     int32_t gear_selection;
2395     // Value should be one of enum vehicle_gear.
2396     int32_t gear_current_gear;
2397     // Value should be one of enum vehicle_boolean.
2398     int32_t parking_brake;
2399     // If cruise_set_speed > 0 then cruise is ON otherwise cruise is OFF.
2400     // Unit: meters / second (m/s).
2401     //int32_t cruise_set_speed;
2402     // Value should be one of enum vehicle_boolean.
2403     int32_t is_fuel_level_low;
2404     // Value should be one of enum vehicle_driving_status.
2405     int32_t driving_status;
2406     int32_t night_mode;
2407     // Value should be one of emum vehicle_turn_signal.
2408     int32_t turn_signals;
2409     // Value should be one of enum vehicle_boolean.
2410     //int32_t engine_on;
2411 
2412     // HVAC properties.
2413     vehicle_hvac_t hvac;
2414 
2415     float outside_temperature;
2416     float cabin_temperature;
2417 
2418 } vehicle_value_t;
2419 
2420 /*
2421  * Encapsulates the property name and the associated value. It
2422  * is used across various API calls to set values, get values or to register for
2423  * events.
2424  */
2425 typedef struct vehicle_prop_value {
2426     /* property identifier */
2427     int32_t prop;
2428 
2429     /* value type of property for quick conversion from union to appropriate
2430      * value. The value must be one of enum vehicle_value_type.
2431      */
2432     int32_t value_type;
2433 
2434     /** time is elapsed nanoseconds since boot */
2435     int64_t timestamp;
2436 
2437     /**
2438      * Zone information for zoned property. For non-zoned property, this should be ignored.
2439      */
2440     union {
2441         int32_t zone;
2442         int32_t seat;
2443         int32_t window;
2444     };
2445 
2446     vehicle_value_t value;
2447 } vehicle_prop_value_t;
2448 
2449 /*
2450  * Event callback happens whenever a variable that the API user has subscribed
2451  * to needs to be reported. This may be based purely on threshold and frequency
2452  * (a regular subscription, see subscribe call's arguments) or when the set()
2453  * command is executed and the actual change needs to be reported.
2454  *
2455  * event_data is OWNED by the HAL and should be copied before the callback
2456  * finishes.
2457  */
2458 typedef int (*vehicle_event_callback_fn)(const vehicle_prop_value_t *event_data);
2459 
2460 
2461 /**
2462  * Represent the operation where the current error has happened.
2463  */
2464 enum vehicle_property_operation {
2465     /** Generic error to this property which is not tied to any operation. */
2466     VEHICLE_OPERATION_GENERIC = 0,
2467     /** Error happened while handling property set. */
2468     VEHICLE_OPERATION_SET = 1,
2469     /** Error happened while handling property get. */
2470     VEHICLE_OPERATION_GET = 2,
2471     /** Error happened while handling property subscription. */
2472     VEHICLE_OPERATION_SUBSCRIBE = 3,
2473 };
2474 
2475 /*
2476  * Suggests that an error condition has occurred.
2477  *
2478  * @param error_code Error code. error_code should be standard error code with
2479  *                negative value like -EINVAL.
2480  * @parm property Note a property where error has happened. If this is generic error, property
2481  *                should be VEHICLE_PROPERTY_INVALID.
2482  * @param operation Represent the operation where the error has happened. Should be one of
2483  *                  vehicle_property_operation.
2484  */
2485 typedef int (*vehicle_error_callback_fn)(int32_t error_code, int32_t property, int32_t operation);
2486 
2487 /************************************************************************************/
2488 
2489 /*
2490  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
2491  * and the fields of this data structure must begin with hw_module_t
2492  * followed by module specific information.
2493  */
2494 typedef struct vehicle_module {
2495     struct hw_module_t common;
2496 } vehicle_module_t;
2497 
2498 
2499 typedef struct vehicle_hw_device {
2500     struct hw_device_t common;
2501 
2502     /**
2503      * After calling open on device the user should register callbacks for event and error
2504      * functions.
2505      */
2506     int (*init)(struct vehicle_hw_device* device,
2507                 vehicle_event_callback_fn event_fn, vehicle_error_callback_fn err_fn);
2508     /**
2509      * Before calling close the user should destroy the registered callback
2510      * functions.
2511      * In case the unsubscribe() call is not called on all properties before
2512      * release() then release() will unsubscribe the properties itself.
2513      */
2514     int (*release)(struct vehicle_hw_device* device);
2515 
2516     /**
2517      * Enumerate all available properties. The list is returned in "list".
2518      * @param num_properties number of properties contained in the retuned array.
2519      * @return array of property configs supported by this car. Note that returned data is const
2520      *         and caller cannot modify it. HAL implementation should keep this memory until HAL
2521      *         is released to avoid copying this again.
2522      */
2523     vehicle_prop_config_t const *(*list_properties)(struct vehicle_hw_device* device,
2524             int* num_properties);
2525 
2526     /**
2527      * Get a vehicle property value immediately. data should be allocated
2528      * properly.
2529      * The caller of the API OWNS the data field.
2530      * Caller will set data->prop, data->value_type, and optionally zone value for zoned property.
2531      * But HAL implementation needs to fill all entries properly when returning.
2532      * For pointer type, HAL implementation should allocate necessary memory and caller is
2533      * responsible for calling release_memory_from_get, which allows HAL to release allocated
2534      * memory.
2535      * For VEHICLE_PROP_CHANGE_MODE_STATIC type of property, get should return the same value
2536      * always.
2537      * For VEHICLE_PROP_CHANGE_MODE_ON_CHANGE type of property, it should return the latest value.
2538      * If there is no data available yet, which can happen during initial stage, this call should
2539      * return immediately with error code of -EAGAIN.
2540      */
2541     int (*get)(struct vehicle_hw_device* device, vehicle_prop_value_t *data);
2542 
2543     /**
2544      * Release memory allocated to data in previous get call. get call for byte or string involves
2545      * allocating necessary memory from vehicle hal.
2546      * To be safe, memory allocated by vehicle hal should be released by vehicle hal and vehicle
2547      * network service will call this when data from vehicle hal is no longer necessary.
2548      * vehicle hal implementation should only release member of vehicle_prop_value_t like
2549      * data->str_value.data or data->bytes_value.data but not data itself as data itself is
2550      * allocated from vehicle network service. Once memory is freed, corresponding pointer should
2551      * be set to NULL bu vehicle hal.
2552      */
2553     void (*release_memory_from_get)(struct vehicle_hw_device* device, vehicle_prop_value_t *data);
2554 
2555     /**
2556      * Set a vehicle property value.  data should be allocated properly and not
2557      * NULL.
2558      * The caller of the API OWNS the data field.
2559      * timestamp of data will be ignored for set operation.
2560      * Setting some properties require having initial state available. Depending on the vehicle hal,
2561      * such initial data may not be available for short time after init. In such case, set call
2562      * can return -EAGAIN like get call.
2563      * For a property with separate power control, set can fail if the property is not powered on.
2564      * In such case, hal should return -ESHUTDOWN error.
2565      */
2566     int (*set)(struct vehicle_hw_device* device, const vehicle_prop_value_t *data);
2567 
2568     /**
2569      * Subscribe to events.
2570      * Depending on output of list_properties if the property is:
2571      * a) on-change: sample_rate should be set to 0.
2572      * b) supports frequency: sample_rate should be set from min_sample_rate to
2573      * max_sample_rate.
2574      * For on-change type of properties, vehicle network service will make another get call to check
2575      * the initial state. Due to this, vehicle hal implementation does not need to send initial
2576      * state for on-change type of properties.
2577      * @param device
2578      * @param prop
2579      * @param sample_rate
2580      * @param zones All subscribed zones for zoned property. can be ignored for non-zoned property.
2581      *              0 means all zones supported instead of no zone.
2582      */
2583     int (*subscribe)(struct vehicle_hw_device* device, int32_t prop, float sample_rate,
2584             int32_t zones);
2585 
2586     /** Cancel subscription on a property. */
2587     int (*unsubscribe)(struct vehicle_hw_device* device, int32_t prop);
2588 
2589     /**
2590      * Print out debugging state for the vehicle hal. This will be called by
2591      * the vehicle network service and will be included into the service' dump.
2592      *
2593      * The passed-in file descriptor can be used to write debugging text using
2594      * dprintf() or write(). The text should be in ASCII encoding only.
2595      *
2596      * Performance requirements:
2597      *
2598      * This must be a non-blocking call. The HAL should return from this call
2599      * in 1ms, must return from this call in 10ms. This call must avoid
2600      * deadlocks, as it may be called at any point of operation.
2601      * Any synchronization primitives used (such as mutex locks or semaphores)
2602      * should be acquired with a timeout.
2603      */
2604     int (*dump)(struct vehicle_hw_device* device, int fd);
2605 
2606 } vehicle_hw_device_t;
2607 
2608 __END_DECLS
2609 
2610 #endif  // ANDROID_VEHICLE_INTERFACE_H
2611