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