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