C

Vehicle Properties Browser

Presents an editable list of available properties grouped by component using QML models.

"QtAA Vehicle Properties Browser Example Screenshot"

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

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: [
                        'Driver', 'Passenger'
                    ]
                },
                {
                    name: 'maxDefrostOn',
                    property_id: 'HVAC_MAX_DEFROST_ON'
                },
                {
                    name: 'seatTemperature',
                    property_id: 'HVAC_SEAT_TEMPERATURE',
                    zones: [
                        'Driver', 'Passenger'
                    ]
                },
                {
                    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:['Row1Left', 'Row1Right', 'Row2Left', 'Row2Right', 'Rear'],
                    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.