Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30c84c30 authored by Pavel Maltsev's avatar Pavel Maltsev
Browse files

Add more HVAC properties to default vehicle HAL

Bug: b/32949617

Test: manually using Hvac app

Change-Id: Id65921f29828f6b0dc23cc589672e877aa969ae1
parent 62f5274b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ interface IVehicleCallback {
    oneway onPropertyEvent(vec<VehiclePropValue> propValues);

    /*
     * This method gets called if the client was susbscribed to a property using
     * This method gets called if the client was subscribed to a property using
     * SubscribeFlags::SET_CALL flag and IVehicle#set(...) method was called.
     *
     * These events must be delivered to subscriber immediately without any
+1 −1
Original line number Diff line number Diff line
service vehicle-hal-2.0 /system/bin/hw/android.hardware.vehicle@2.0-service
    class hal
    user system
    group system readproc
    group system
+92 −12
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define android_hardware_vehicle_V2_0_impl_DefaultConfig_H_

#include <android/hardware/vehicle/2.0/IVehicle.h>
#include <vehicle_hal_manager/VehicleUtils.h>

namespace android {
namespace hardware {
@@ -34,24 +35,103 @@ const VehiclePropConfig kVehicleProperties[] = {
        .permissionModel = VehiclePermissionModel::OEM_ONLY,
    },

    {
        .prop = VehicleProperty::HVAC_POWER_ON,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas = toInt(VehicleAreaZone::ROW_1)
    },

    {
        .prop = VehicleProperty::HVAC_DEFROSTER,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas =
                VehicleAreaWindow::FRONT_WINDSHIELD
                | VehicleAreaWindow::REAR_WINDSHIELD
    },

    {
        .prop = VehicleProperty::HVAC_RECIRC_ON,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas = toInt(VehicleAreaZone::ROW_1)
    },

    {
        .prop = VehicleProperty::HVAC_AC_ON,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas = toInt(VehicleAreaZone::ROW_1)
    },

    {
        .prop = VehicleProperty::HVAC_AUTO_ON,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas = toInt(VehicleAreaZone::ROW_1)
    },

    {
        .prop = VehicleProperty::HVAC_FAN_SPEED,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas = static_cast<int32_t>(
            VehicleAreaZone::ROW_1_LEFT | VehicleAreaZone::ROW_1_RIGHT),
        .supportedAreas = toInt(VehicleAreaZone::ROW_1),
        .areaConfigs = init_hidl_vec({
                VehicleAreaConfig {
                     .areaId = toInt(VehicleAreaZone::ROW_2_LEFT),
                    .areaId = toInt(VehicleAreaZone::ROW_1),
                    .minInt32Value = 1,
                     .maxInt32Value = 7},
                    .maxInt32Value = 7
                }})
    },

    {
        .prop = VehicleProperty::HVAC_FAN_DIRECTION,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas = toInt(VehicleAreaZone::ROW_1),
    },

    {
        .prop = VehicleProperty::HVAC_TEMPERATURE_SET,
        .access = VehiclePropertyAccess::READ_WRITE,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
        .supportedAreas =
                VehicleAreaZone::ROW_1_LEFT
                | VehicleAreaZone::ROW_1_RIGHT,
        .areaConfigs = init_hidl_vec({
            VehicleAreaConfig {
                .areaId = toInt(VehicleAreaZone::ROW_1_LEFT),
                .minFloatValue = 16,
                .maxFloatValue = 32,
            },
            VehicleAreaConfig {
                .areaId = toInt(VehicleAreaZone::ROW_1_RIGHT),
                     .minInt32Value = 1,
                     .maxInt32Value = 5,
                 }
             }),
                .minFloatValue = 16,
                .maxFloatValue = 32,
            }})
    },

    {
        .prop = VehicleProperty::NIGHT_MODE,
        .access = VehiclePropertyAccess::READ,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
    },

    {
        .prop = VehicleProperty::GEAR_SELECTION,
        .access = VehiclePropertyAccess::READ,
        .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
        .permissionModel = VehiclePermissionModel::NO_RESTRICTION,
    },

    {
+102 −18
Original line number Diff line number Diff line
@@ -30,23 +30,56 @@ VehicleHal::VehiclePropValuePtr DefaultVehicleHal::get(
    VehiclePropValuePtr v;
    VehicleProperty property = requestedPropValue.prop;
    int32_t areaId = requestedPropValue.areaId;
    auto& pool = *getValuePool();

    switch (property) {
        case VehicleProperty::INFO_MAKE:
            v = getValuePool()->obtainString("Default Car");
            v = pool.obtainString("Default Car");
            break;
        case VehicleProperty::HVAC_FAN_SPEED:
            int32_t value;
            *outStatus = getHvacFanSpeed(areaId, &value);
            v = pool.obtainInt32(mFanSpeed);
            break;
        case VehicleProperty::HVAC_POWER_ON:
            v = pool.obtainBoolean(mHvacPowerOn);
            break;
        case VehicleProperty::HVAC_RECIRC_ON:
            v = pool.obtainBoolean(mHvacRecircOn);
            break;
        case VehicleProperty::HVAC_AC_ON:
            v = pool.obtainBoolean(mHvacAcOn);
            break;
        case VehicleProperty::HVAC_AUTO_ON:
            v = pool.obtainBoolean(mHvacAutoOn);
            break;
        case VehicleProperty::HVAC_FAN_DIRECTION:
            v = pool.obtainInt32(toInt(mFanDirection));
            break;
        case VehicleProperty::HVAC_DEFROSTER:
            bool defroster;
            *outStatus = getHvacDefroster(areaId, &defroster);
            if (StatusCode::OK == *outStatus) {
                v = pool.obtainBoolean(defroster);
            }
            break;
        case VehicleProperty::HVAC_TEMPERATURE_SET:
            float value;
            *outStatus = getHvacTemperature(requestedPropValue.areaId,
                                            &value);
            if (StatusCode::OK == *outStatus) {
                v = getValuePool()->obtainInt32(value);
                v = pool.obtainFloat(value);
            }
            break;
        case VehicleProperty::INFO_FUEL_CAPACITY:
            v = getValuePool()->obtainFloat(0.75f);
            v = pool.obtainFloat(0.75f);
            break;
        case VehicleProperty::DISPLAY_BRIGHTNESS:
            v = getValuePool()->obtainInt32(brightness);
            v = pool.obtainInt32(mBrightness);
            break;
        case VehicleProperty::NIGHT_MODE:
            v = pool.obtainBoolean(false);
            break;
        case VehicleProperty::GEAR_SELECTION:
            v = pool.obtainInt32(toInt(VehicleGear::GEAR_PARK));
            break;
        default:
            *outStatus = StatusCode::INVALID_ARG;
@@ -63,16 +96,38 @@ VehicleHal::VehiclePropValuePtr DefaultVehicleHal::get(

StatusCode DefaultVehicleHal::set(const VehiclePropValue& propValue) {
    auto property = propValue.prop;
    const auto& v = propValue.value;

    StatusCode status = StatusCode::OK;

    switch (property) {
        case VehicleProperty::HVAC_POWER_ON:
            mHvacPowerOn = v.int32Values[0] == 1;
            break;
        case VehicleProperty::HVAC_RECIRC_ON:
            mHvacRecircOn = v.int32Values[0] == 1;
            break;
        case VehicleProperty::HVAC_AC_ON:
            mHvacAcOn = v.int32Values[0] == 1;
            break;
        case VehicleProperty::HVAC_AUTO_ON:
            mHvacAutoOn = v.int32Values[0] == 1;
            break;
        case VehicleProperty::HVAC_DEFROSTER:
            status = setHvacDefroster(propValue.areaId, v.int32Values[0] == 1);
            break;
        case VehicleProperty::HVAC_FAN_DIRECTION:
            mFanDirection =
                    static_cast<VehicleHvacFanDirection>(v.int32Values[0]);
            break;
        case VehicleProperty::HVAC_FAN_SPEED:
            status = setHvacFanSpeed(propValue.areaId,
                                     propValue.value.int32Values[0]);
            mFanSpeed = v.int32Values[0];
            break;
        case VehicleProperty::HVAC_TEMPERATURE_SET:
            status = setHvacTemperature(propValue.areaId, v.floatValues[0]);
            break;
        case VehicleProperty::DISPLAY_BRIGHTNESS:
            brightness = propValue.value.int32Values[0];
            mBrightness = v.int32Values[0];
            break;
        default:
            status = StatusCode::INVALID_ARG;
@@ -81,23 +136,52 @@ StatusCode DefaultVehicleHal::set(const VehiclePropValue& propValue) {
    return status;
}

StatusCode DefaultVehicleHal::getHvacFanSpeed(int32_t areaId,
                                            int32_t* outValue)  {
StatusCode DefaultVehicleHal::getHvacTemperature(int32_t areaId,
                                                 float* outValue)  {
    if (areaId == toInt(VehicleAreaZone::ROW_1_LEFT)) {
        *outValue = fanSpeedRow1Left;
    } else if (areaId == toInt(VehicleAreaZone::ROW_2_RIGHT)) {
        *outValue = fanSpeedRow1Right;
        *outValue = mRow1LeftHvacTemperatureSet;
    } else if (areaId == toInt(VehicleAreaZone::ROW_1_RIGHT)) {
        *outValue = mRow1RightHvacTemperatureSet;
    } else {
        return StatusCode::INVALID_ARG;
    }
    return StatusCode::OK;
}

StatusCode DefaultVehicleHal::setHvacFanSpeed(int32_t areaId, int32_t value) {
StatusCode DefaultVehicleHal::setHvacTemperature(
    int32_t areaId, float value) {
    if (areaId == toInt(VehicleAreaZone::ROW_1_LEFT)) {
        fanSpeedRow1Left = value;
    } else if (areaId == toInt(VehicleAreaZone::ROW_2_RIGHT)) {
        fanSpeedRow1Right = value;
        mRow1LeftHvacTemperatureSet = value;
    } else if (areaId == toInt(VehicleAreaZone::ROW_1_RIGHT)) {
        mRow1RightHvacTemperatureSet = value;
    } else {
        return StatusCode::INVALID_ARG;
    }
    return StatusCode::OK;
}

StatusCode DefaultVehicleHal::getHvacDefroster(int32_t areaId,
                                               bool* outValue) {
    ALOGI("Getting Hvac defroster for area: 0x%x", areaId);

    if (areaId == toInt(VehicleAreaWindow::FRONT_WINDSHIELD)) {
        *outValue = mFrontDefroster;
    } else if (areaId == toInt(VehicleAreaWindow::REAR_WINDSHIELD)) {
        *outValue = mRearDefroster;
    } else {
        ALOGE("Unable to get hvac defroster for area: 0x%x", areaId);
        return StatusCode::INVALID_ARG;
    }

    ALOGI("Getting Hvac defroster for area: 0x%x, OK", areaId);
    return StatusCode::OK;
}

StatusCode DefaultVehicleHal::setHvacDefroster(int32_t areaId, bool value) {
    if (areaId == toInt(VehicleAreaWindow::FRONT_WINDSHIELD)) {
        mFrontDefroster = value;
    } else if (areaId == toInt(VehicleAreaWindow::REAR_WINDSHIELD)) {
        mRearDefroster = value;
    } else {
        return StatusCode::INVALID_ARG;
    }
+15 −5
Original line number Diff line number Diff line
@@ -53,12 +53,22 @@ public:
    }

private:
    StatusCode getHvacFanSpeed(int32_t areaId, int32_t* outValue);
    StatusCode setHvacFanSpeed(int32_t areaId, int32_t value);
    StatusCode getHvacTemperature(int32_t areaId, float* outValue);
    StatusCode setHvacTemperature(int32_t areaId, float value);
    StatusCode getHvacDefroster(int32_t areaId, bool* outValue);
    StatusCode setHvacDefroster(int32_t areaId, bool value);
private:
    int32_t fanSpeedRow1Left = 3;
    int32_t fanSpeedRow1Right = 5;
    int32_t brightness = 7;
    int32_t mFanSpeed = 3;
    int32_t mBrightness = 7;
    float mRow1LeftHvacTemperatureSet = 16;
    float mRow1RightHvacTemperatureSet = 22;
    bool mFrontDefroster = false;
    bool mRearDefroster = false;
    bool mHvacPowerOn = true;
    bool mHvacRecircOn = true;
    bool mHvacAcOn = true;
    bool mHvacAutoOn = true;
    VehicleHvacFanDirection mFanDirection = VehicleHvacFanDirection::FACE;
};

}  // impl