blob: 084929a2de12d46656d690b1b4a13bcb4b0aa843 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.support.car.test;
import android.util.Log;
import com.android.car.hardware.hvac.CarHvacManager;
import com.android.car.hardware.hvac.CarHvacManager.CarHvacEventListener;
import com.android.car.hardware.hvac.CarHvacManager.CarHvacBooleanValue;
import com.android.car.hardware.hvac.CarHvacManager.CarHvacFloatValue;
import com.android.car.hardware.hvac.CarHvacManager.CarHvacIntValue;
import com.android.car.CarSystem;
import com.android.car.VehicleHalEmulator;
import com.android.car.vehiclenetwork.VehicleNetworkConsts;
import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
import com.android.car.vehiclenetwork.VehiclePropValueUtil;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.HashMap;
public class CarHvacManagerTest extends MockedCarTestBase {
private static final String TAG = CarHvacManagerTest.class.getSimpleName();
// Use this semaphore to block until the callback is heard of.
private Semaphore mAvailable;
private CarHvacManager mCarHvacManager;
private boolean mEventBoolVal;
private float mEventFloatVal;
private int mEventIntVal;
private int mEventZoneVal;
@Override
protected void setUp() throws Exception {
super.setUp();
mAvailable = new Semaphore(0);
HvacPropertyHandler handler = new HvacPropertyHandler();
getVehicleHalEmulator().addProperty(
VehiclePropConfigUtil.createProperty(
VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER,
VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,
1), handler);
getVehicleHalEmulator().addProperty(
VehiclePropConfigUtil.createProperty(
VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED,
VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32,
1), handler);
getVehicleHalEmulator().addProperty(
VehiclePropConfigUtil.createProperty(
VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET,
VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,
1), handler);
getVehicleHalEmulator().start();
mCarHvacManager =
(CarHvacManager) getCarApi().getCarManager(CarSystem.HVAC_SERVICE);
}
// Test a boolean property
public void testHvacRearDefrosterOn() throws Exception {
boolean defrost;
mCarHvacManager.setBooleanProperty(CarHvacManager.HVAC_REAR_DEFROSTER_ON,
CarHvacManager.HVAC_ZONE_ALL, true);
defrost = mCarHvacManager.getBooleanProperty(CarHvacManager.HVAC_REAR_DEFROSTER_ON,
CarHvacManager.HVAC_ZONE_ALL);
assertEquals("Front defroster is " + defrost, true, defrost);
mCarHvacManager.setBooleanProperty(CarHvacManager.HVAC_REAR_DEFROSTER_ON,
CarHvacManager.HVAC_ZONE_ALL, false);
defrost = mCarHvacManager.getBooleanProperty(CarHvacManager.HVAC_REAR_DEFROSTER_ON,
CarHvacManager.HVAC_ZONE_ALL);
assertEquals("Front defroster is " + defrost, false, defrost);
}
// Test an integer property
public void testHvacFanSpeed() throws Exception {
int speed;
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT, 15);
speed = mCarHvacManager.getIntProperty(CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT);
assertEquals("Fan speed is " + speed, 15, speed);
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT, 23);
speed = mCarHvacManager.getIntProperty(CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT);
assertEquals("Fan speed is " + speed, 23, speed);
}
// Test an float property
public void testHvacTempSetpoint() throws Exception {
float temp;
mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT, 70);
temp = mCarHvacManager.getFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT);
assertEquals("Temperature setpoint is " + temp, 70.0, temp, 0);
mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT, (float) 65.5);
temp = mCarHvacManager.getFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
CarHvacManager.HVAC_ZONE_ROW_1_LEFT);
assertEquals("Temperature setpoint is " + temp, 65.5, temp, 0);
}
// Test an event
public void testEvent() throws Exception {
boolean success;
EventListener l = new EventListener();
mCarHvacManager.registerListener(l);
// Inject a boolean event and wait for its callback in onPropertySet.
VehiclePropValue v = VehiclePropValueUtil.createZonedBooleanValue(
VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AC_ON,
CarHvacManager.HVAC_ZONE_ALL, true, 0);
assertEquals("Lock should be freed by now.", 0, mAvailable.availablePermits());
getVehicleHalEmulator().injectEvent(v);
success = mAvailable.tryAcquire(2L, TimeUnit.SECONDS);
assertEquals("injectEvent, onEvent timeout!", true, success);
assertEquals("Value is incorrect", mEventBoolVal, true);
assertEquals("Zone is incorrect", mEventZoneVal, CarHvacManager.HVAC_ZONE_ALL);
// Inject a float event and wait for its callback in onPropertySet.
v = VehiclePropValueUtil.createZonedFloatValue(
VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT,
CarHvacManager.HVAC_ZONE_ROW_1_ALL, 67, 0);
assertEquals("Lock should be freed by now.", 0, mAvailable.availablePermits());
getVehicleHalEmulator().injectEvent(v);
success = mAvailable.tryAcquire(2L, TimeUnit.SECONDS);
assertEquals("injectEvent, onEvent timeout!", true, success);
assertEquals("Value is incorrect", mEventFloatVal, 67, 0);
assertEquals("Zone is incorrect", mEventZoneVal, CarHvacManager.HVAC_ZONE_ROW_1_ALL);
// Inject an integer event and wait for its callback in onPropertySet.
v = VehiclePropValueUtil.createZonedIntValue(
VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED,
CarHvacManager.HVAC_ZONE_ROW_1_RIGHT, 4, 0);
assertEquals("Lock should be freed by now.", 0, mAvailable.availablePermits());
getVehicleHalEmulator().injectEvent(v);
success = mAvailable.tryAcquire(2L, TimeUnit.SECONDS);
assertEquals("injectEvent, onEvent timeout!", true, success);
assertEquals("Value is incorrect", mEventIntVal, 4);
assertEquals("Zone is incorrect", mEventZoneVal, CarHvacManager.HVAC_ZONE_ROW_1_RIGHT);
}
private class HvacPropertyHandler
implements VehicleHalEmulator.VehicleHalPropertyHandler {
HashMap<Integer, VehiclePropValue> mMap = new HashMap<Integer, VehiclePropValue>();
@Override
public synchronized void onPropertySet(VehiclePropValue value) {
Log.d(TAG, "onPropertySet intValue = " + value.getZonedValue().getInt32Value() +
" floatValue = " + value.getZonedValue().getFloatValue());
mMap.put(value.getProp(), value);
}
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
Log.d(TAG, "onPropertyGet intValue = " + value.getZonedValue().getInt32Value() +
" floatValue = " + value.getZonedValue().getFloatValue());
return mMap.get(value.getProp());
}
@Override
public synchronized void onPropertySubscribe(int property, int sampleRate) {
Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate);
}
@Override
public synchronized void onPropertyUnsubscribe(int property) {
Log.d(TAG, "onPropertyUnSubscribe property " + property);
}
}
private class EventListener implements CarHvacEventListener {
public EventListener() { }
@Override
public void onChangeEvent(final CarHvacManager.CarHvacBaseProperty value) {
switch (value.getType()) {
case CarHvacManager.PROPERTY_TYPE_BOOLEAN:
CarHvacBooleanValue boolVal = (CarHvacBooleanValue) value;
mEventBoolVal = boolVal.getValue();
mEventZoneVal = boolVal.getZone();
Log.d(TAG, "onChangeEvent - propId = " + boolVal.getPropertyId() +
" bool = " + boolVal.getValue());
break;
case CarHvacManager.PROPERTY_TYPE_FLOAT:
CarHvacFloatValue floatVal = (CarHvacFloatValue) value;
mEventFloatVal = floatVal.getValue();
mEventZoneVal = floatVal.getZone();
Log.d(TAG, "onChangeEvent - propId = " + floatVal.getPropertyId() +
" float = " + floatVal.getValue());
break;
case CarHvacManager.PROPERTY_TYPE_INT:
CarHvacIntValue intVal = (CarHvacIntValue) value;
mEventIntVal = intVal.getValue();
mEventZoneVal = intVal.getZone();
Log.d(TAG, "onChangeEvent - propId = " + intVal.getPropertyId() +
" int = " + intVal.getValue());
break;
}
mAvailable.release();
}
@Override
public void onErrorEvent(final int propertyId, final int zone) {
Log.d(TAG, "Error: propertyId=" + propertyId + " zone=" + zone);
}
}
}