C
Vehicle Properties Browser
Presents an editable list of available properties grouped by component using QML models.
Building and deploying the example
See specific steps relating to building and deploying Qt for Android Automotive examples.
Overview
The example presents a list of available properties from the Vehicle Properties library. The properties are grouped by QFace
modules, for example: HVAC
, WindowControl
and so on.
The first thing to do when using vehicle properties in QML is to import the Qt Vehicle Properties front end:
import QtIf.Android.VehicleProperties 1.0
Communication
The example provides two-way communication between the application and Android VHAL. Property modifications made to the app are visible in the Android VHAL. The reverse is true as well: changes made in the Android VHAL are immediately reflected in the app. The available properties and the required metadata are collected under a single property defined in PropertiesModelDefinition.qml
:
readonly property var modulesModelData: [ { name: 'QIfHvac', object: climateControl, properties: [ { name: 'powerOn', property_id: 'HVAC_POWER_ON' }, { name: 'acOn', property_id: 'HVAC_AC_ON' }, { name: 'maxAcOn', property_id: 'HVAC_MAX_AC_ON' }, { name: 'dualOn', property_id: 'HVAC_DUAL_ON' }, { name: 'autoOn', property_id: 'HVAC_AUTO_ON' }, { name: 'temperatureSet', property_id: 'HVAC_TEMPERATURE_SET', zones: ['DriverSide', 'PassengerSide'] }, { name: 'fanDirection', property_id: 'HVAC_FAN_DIRECTION', values: ['FACE', 'FLOOR', 'DEFROST'] }, { name: 'fanSpeed', property_id: 'HVAC_FAN_SPEED' }, { name: 'defroster', property_id: 'HVAC_DEFROSTER', zones: ['FrontWindshield', 'RearWindshield'] }, { name: 'recircOn', property_id: 'HVAC_RECIRC_ON' }, { name: 'autoRecircOn', property_id: 'HVAC_AUTO_RECIRC_ON' }, { name: 'seatVentilation', property_id: 'HVAC_SEAT_VENTILATION', zones: [ 'Passenger', 'Driver' ] }, { name: 'maxDefrostOn', property_id: 'HVAC_MAX_DEFROST_ON' }, { name: 'seatTemperature', property_id: 'HVAC_SEAT_TEMPERATURE', zones: [ 'Passenger', 'Driver' ] }, { name: 'steeringWheelHeat', property_id: 'HVAC_STEERING_WHEEL_HEAT', zones: [ 'Global' ] }, { name: 'temperatureDisplayUnits', property_id: 'HVAC_TEMPERATURE_DISPLAY_UNITS', values: ['CELSIUS', 'FAHRENHEIT'], zones: [ 'Global' ], exclusive: true } ] }, { name: 'QIfWindowControl', object: windowControl, properties: [ { name: 'windowPos', property_id: 'WINDOW_POS', zones: [ 'Driver', 'Passenger', 'PassengerRow2Left', 'PassengerRow2Right', 'Roof1' ] }, { name: 'windowLock', property_id: 'WINDOW_LOCK', readonly: true } ] }, { name: 'QIfCarInfo', object: carInfo, properties: [ { name: 'infoFuelCapacity', property_id: 'INFO_FUEL_CAPACITY', readonly: true }, { name: 'infoEvBatteryCapacity', property_id: 'INFO_EV_BATTERY_CAPACITY', readonly: true }, { name: 'infoFuelDoorLocation', property_id: 'INFO_FUEL_DOOR_LOCATION', readonly: true }, { name: 'infoEvPortLocation', property_id: 'INFO_EV_PORT_LOCATION', readonly: true }, { name: 'infoDriverSeat', property_id: 'INFO_DRIVER_SEAT', readonly: true } ] }, { name: 'QIfTireControl', object: tireControl, properties: [ { name: 'tirePressure', property_id: 'TIRE_PRESSURE', zones: [ 'RightFront', 'LeftFront', 'RightRear', 'LeftRear' ], readonly: true } ] }, { name: 'QIfLightsControl', object: lightsControl, properties: [ { name: 'headlightsState', property_id: 'HEADLIGHTS_STATE', readonly: true }, { name: 'highbeamLightsState', property_id: 'HIGH_BEAM_LIGHTS_STATE', readonly: true }, { name: 'fogLightsState', property_id: 'FOG_LIGHTS_STATE', readonly: true }, { name: 'hazardLightsState', property_id: 'HAZARD_LIGHTS_STATE', readonly: true }, { name: 'headlightsSwitch', property_id: 'HEADLIGHTS_SWITCH', readonly: false }, { name: 'highbeamLightsSwitch', property_id: 'HIGH_BEAM_LIGHTS_SWITCH', readonly: false }, { name: 'fogLightsSwitch', property_id: 'FOG_LIGHTS_SWITCH', readonly: false }, { name: 'hazardLightsSwitch', property_id: 'HAZARD_LIGHTS_SWITCH', readonly: false }, { name: 'nightMode', property_id: 'NIGHT_MODE', readonly: true } ] }, { name: 'QIfFuelControl', object: fuelControl, properties: [ { name: 'fuelLevel', property_id: 'FUEL_LEVEL', readonly: true }, { name: 'fuelLevelLow', property_id: 'FUEL_LEVEL_LOW', readonly: true }, { name: 'fuelDoorOpen', property_id: 'FUEL_DOOR_OPEN', readonly: false }, { name: 'evBatteryInstantaneousChargeRate', property_id: 'EV_BATTERY_INSTANTANEOUS_CHARGE_RATE', readonly: true }, { name: 'evBatteryLevel', property_id: 'EV_BATTERY_LEVEL', readonly: true }, { name: 'evChargePortConnected', property_id: 'EV_CHARGE_PORT_CONNECTED', readonly: true }, { name: 'evChargePortOpen', property_id: 'EV_CHARGE_PORT_OPEN', readonly: true }, { name: 'rangeRemaining', property_id: 'RANGE_REMAINING', readonly: true } ] }, { name: 'QIfDoorControl', object: doorControl, properties: [ { name: 'doorPos', property_id: 'DOOR_POS', zones:['Rear', 'Row1Left', 'Row1Right', 'Row2Left', 'Row2Right'], readonly: false }, { name: 'doorLock', zones:['Row1Left', 'Row1Right', 'Row2Left', 'Row2Right'], property_id: 'DOOR_LOCK', readonly: false } ] }, { name: 'QIfDriveInfo', object: driveInfo, properties: [ { name: 'perfOdometer', property_id: 'PERF_ODOMETER', readonly: true }, { name: 'perfVehicleSpeed', property_id: 'PERF_VEHICLE_SPEED', readonly: true }, { name: 'gearSelection', property_id: 'GEAR_SELECTION', readonly: true }, { name: 'currentGear', property_id: 'CURRENT_GEAR', readonly: true }, { name: 'parkingBrakeOn', property_id: 'PARKING_BRAKE_ON', readonly: true }, { name: 'ignitionState', property_id: 'IGNITION_STATE', readonly: true }, { name: 'absActive', property_id: 'ABS_ACTIVE', readonly: true }, { name: 'tractionControlActive', property_id: 'TRACTION_CONTROL_ACTIVE', readonly: true }, { name: 'distanceDisplayUnits', property_id: 'DISTANCE_DISPLAY_UNITS', readonly: false }, { name: 'envOutsideTemperature', property_id: 'ENV_OUTSIDE_TEMPERATURE', readonly: true } ] }, { name: 'QIfEngineInfo', object: engineInfo, properties: [ { name: 'engineOilLevel', property_id: 'ENGINE_OIL_LEVEL', readonly: true }, { name: 'engineOilTemp', property_id: 'ENGINE_OIL_TEMP', readonly: true }, { name: 'engineRpm', property_id: 'ENGINE_RPM', readonly: true } ] } ]
Each top-level entry provides metadata for a single Vehicle Properties component and its properties. The instances of the components declared in the same file are also referenced through the object
field.
HVAC { id: climateControl } WindowControl { id: windowControl }
The QML model
The QML model is defined in PropertiesModel.qml
. It uses a property's metadata and component instances, these are defined in PropertiesModelDefinition.qml
. Any bindings necessary to update the QML model, whenever the data model of Android VHAL has changed, are created using an Instantiator:
Instantiator { id: syncingInstantiator model: listModel delegate: Instantiator { id: propertiesInstantiator readonly property int moduleIndex: index model: properties delegate: Instantiator { id: zonesInstantiator model: zones readonly property string propertyName: name delegate: QtObject { readonly property var propertyValue: { const module = definitions.modulesModelData[moduleIndex] const object = module.object const zonedObject = internal.resolveZone(object, zone) const ret = zonedObject[zonesInstantiator.propertyName] if (typeof ret === 'number' && !Number.isInteger(ret)) return ret.toFixed(2) return ret } onPropertyValueChanged: { zones.get(index).valueWrapper = { value: propertyValue } } } } } }
Altering properties
Altering properties from the application level is done as follows:
function updateProperty(moduleIndex, propertyIndex, zoneIndex, value) { const module = definitions.modulesModelData[moduleIndex] const property = module.properties[propertyIndex] const zones = property.zones || [] const moduleObject = module.object const zonedObject = internal.resolveZone(moduleObject, zones[zoneIndex] || '') zonedObject[property.name] = value }
The user interface
The user interface consists of two components based on ListView: ModulesList
and PropertiesList
. These use the provided QML model. Finally, the visual representation of the property is rendered by a ValueDelegate
component which provides the appropriate controls depending on the property type and other metadata.
See also Qt IF Android Vehicle Properties, Qt for Android, and Qt Interface Framework.
Available under certain Qt licenses.
Find out more.