CarHvacManagerTest.java revision af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1b
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 17package com.android.car.test; 18 19import android.car.Car; 20import android.car.hardware.hvac.CarHvacManager; 21import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback; 22import android.car.hardware.CarPropertyValue; 23import android.car.test.VehicleHalEmulator; 24import android.test.suitebuilder.annotation.MediumTest; 25import android.util.Log; 26 27import com.android.car.vehiclenetwork.VehicleNetworkConsts; 28import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess; 29import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode; 30import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType; 31import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleWindow; 32import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone; 33import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue; 34import com.android.car.vehiclenetwork.VehiclePropConfigUtil; 35import com.android.car.vehiclenetwork.VehiclePropValueUtil; 36 37import java.util.HashMap; 38import java.util.concurrent.Semaphore; 39import java.util.concurrent.TimeUnit; 40 41@MediumTest 42public class CarHvacManagerTest extends MockedCarTestBase { 43 private static final String TAG = CarHvacManagerTest.class.getSimpleName(); 44 45 // Use this semaphore to block until the callback is heard of. 46 private Semaphore mAvailable; 47 48 private CarHvacManager mCarHvacManager; 49 private boolean mEventBoolVal; 50 private float mEventFloatVal; 51 private int mEventIntVal; 52 private int mEventZoneVal; 53 54 @Override 55 protected void setUp() throws Exception { 56 super.setUp(); 57 mAvailable = new Semaphore(0); 58 HvacPropertyHandler handler = new HvacPropertyHandler(); 59 getVehicleHalEmulator().addProperty( 60 VehiclePropConfigUtil.createZonedProperty( 61 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER, 62 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, 63 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE, 64 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN, 65 VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, 66 0), handler); 67 getVehicleHalEmulator().addProperty( 68 VehiclePropConfigUtil.createZonedProperty( 69 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED, 70 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, 71 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE, 72 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, 73 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 74 0), handler); 75 getVehicleHalEmulator().addProperty( 76 VehiclePropConfigUtil.createZonedProperty( 77 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET, 78 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, 79 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE, 80 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT, 81 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 82 0), handler); 83 getVehicleHalEmulator().addProperty( 84 VehiclePropConfigUtil.createZonedProperty( 85 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT, 86 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ, 87 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS, 88 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT, 89 VehicleZone.VEHICLE_ZONE_ROW_1_ALL, 90 0), handler); 91 92 getVehicleHalEmulator().start(); 93 mCarHvacManager = (CarHvacManager) getCar().getCarManager(Car.HVAC_SERVICE); 94 } 95 96 // Test a boolean property 97 public void testHvacRearDefrosterOn() throws Exception { 98 mCarHvacManager.setBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON, 99 VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, true); 100 boolean defrost = mCarHvacManager.getBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON, 101 VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD); 102 assertTrue(defrost); 103 104 mCarHvacManager.setBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON, 105 VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, false); 106 defrost = mCarHvacManager.getBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON, 107 VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD); 108 assertFalse(defrost); 109 } 110 111 // Test an integer property 112 public void testHvacFanSpeed() throws Exception { 113 mCarHvacManager.setIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, 114 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 15); 115 int speed = mCarHvacManager.getIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, 116 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT); 117 assertEquals(15, speed); 118 119 mCarHvacManager.setIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, 120 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 23); 121 speed = mCarHvacManager.getIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, 122 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT); 123 assertEquals(23, speed); 124 } 125 126 // Test an float property 127 public void testHvacTempSetpoint() throws Exception { 128 mCarHvacManager.setFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT, 129 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 70); 130 float temp = mCarHvacManager.getFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT, 131 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT); 132 assertEquals(70.0, temp, 0); 133 134 mCarHvacManager.setFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT, 135 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, (float) 65.5); 136 temp = mCarHvacManager.getFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT, 137 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT); 138 assertEquals(65.5, temp, 0); 139 } 140 141 // Test an event 142 public void testEvent() throws Exception { 143 mCarHvacManager.registerCallback(new EventListener()); 144 145 // Inject a boolean event and wait for its callback in onPropertySet. 146 VehiclePropValue v = VehiclePropValueUtil.createZonedBooleanValue( 147 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER, 148 VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, true, 0); 149 assertEquals(0, mAvailable.availablePermits()); 150 getVehicleHalEmulator().injectEvent(v); 151 152 assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS)); 153 assertTrue(mEventBoolVal); 154 assertEquals(mEventZoneVal, VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD); 155 156 // Inject a float event and wait for its callback in onPropertySet. 157 v = VehiclePropValueUtil.createZonedFloatValue( 158 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT, 159 VehicleZone.VEHICLE_ZONE_ROW_1_ALL, 67, 0); 160 assertEquals(0, mAvailable.availablePermits()); 161 getVehicleHalEmulator().injectEvent(v); 162 163 assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS)); 164 assertEquals(mEventFloatVal, 67, 0); 165 assertEquals(mEventZoneVal, VehicleZone.VEHICLE_ZONE_ROW_1_ALL); 166 167 // Inject an integer event and wait for its callback in onPropertySet. 168 v = VehiclePropValueUtil.createZonedIntValue( 169 VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED, 170 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 4, 0); 171 assertEquals(0, mAvailable.availablePermits()); 172 getVehicleHalEmulator().injectEvent(v); 173 174 assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS)); 175 assertEquals(mEventIntVal, 4); 176 assertEquals(mEventZoneVal, VehicleZone.VEHICLE_ZONE_ROW_1_LEFT); 177 } 178 179 180 private class HvacPropertyHandler 181 implements VehicleHalEmulator.VehicleHalPropertyHandler { 182 HashMap<Integer, VehiclePropValue> mMap = new HashMap<>(); 183 184 @Override 185 public synchronized void onPropertySet(VehiclePropValue value) { 186 mMap.put(value.getProp(), value); 187 } 188 189 @Override 190 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) { 191 VehiclePropValue currentValue = mMap.get(value.getProp()); 192 // VNS will call getProperty method when subscribe is called, just return empty value. 193 return currentValue != null ? currentValue : value; 194 } 195 196 @Override 197 public synchronized void onPropertySubscribe(int property, float sampleRate, int zones) { 198 Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate); 199 } 200 201 @Override 202 public synchronized void onPropertyUnsubscribe(int property) { 203 Log.d(TAG, "onPropertyUnSubscribe property " + property); 204 } 205 } 206 207 private class EventListener implements CarHvacEventCallback { 208 public EventListener() { } 209 210 @Override 211 public void onChangeEvent(final CarPropertyValue value) { 212 Log.d(TAG, "onChangeEvent: " + value); 213 Object o = value.getValue(); 214 mEventZoneVal = value.getAreaId(); 215 216 if (o instanceof Integer) { 217 mEventIntVal = (Integer) o; 218 } else if (o instanceof Float) { 219 mEventFloatVal = (Float) o; 220 } else if (o instanceof Boolean) { 221 mEventBoolVal = (Boolean) o; 222 } 223 mAvailable.release(); 224 } 225 226 @Override 227 public void onErrorEvent(final int propertyId, final int zone) { 228 Log.d(TAG, "Error: propertyId=" + propertyId + " zone=" + zone); 229 } 230 } 231} 232