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