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