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