1 /* 2 * Copyright (c) 2016, 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 package com.android.car.hvac; 17 18 import android.car.VehicleAreaType; 19 import android.car.VehicleWindow; 20 import android.car.VehicleZone; 21 import android.car.hardware.CarPropertyConfig; 22 import android.car.hardware.CarPropertyValue; 23 import android.car.hardware.hvac.CarHvacManager; 24 import android.car.hardware.property.CarPropertyEvent; 25 import android.car.hardware.property.ICarProperty; 26 import android.car.hardware.property.ICarPropertyEventListener; 27 import android.os.IBinder; 28 import android.os.RemoteException; 29 import android.util.Pair; 30 31 import java.util.ArrayList; 32 import java.util.Arrays; 33 import java.util.HashMap; 34 import java.util.List; 35 import java.util.Map; 36 37 /** 38 * A local {@link ICarProperty} that is used to mock up data for HVAC. 39 */ 40 public class LocalHvacPropertyService { 41 private static final int DRIVER_ZONE_ID = VehicleZone.ZONE_ROW_1_LEFT; 42 private static final int PASSENGER_ZONE_ID = VehicleZone.ZONE_ROW_1_RIGHT; 43 44 private static final float MIN_TEMP = 16; 45 private static final float MAX_TEMP = 32; 46 47 private static final int MAX_FAN_SPEED = 7; 48 private static final int MIN_FAN_SPEED = 1; 49 50 private static final int DEFAULT_AREA_ID = 0; 51 52 private static final boolean DEFAULT_POWER_ON = true; 53 private static final boolean DEFAULT_DEFROSTER_ON = true; 54 private static final boolean DEFAULT_AIR_CIRCULATION_ON = true; 55 private static final boolean DEFAULT_AC_ON = true; 56 private static final boolean DEFAULT_AUTO_MODE = false; 57 private static final int DEFAULT_FAN_SPEED = 3; 58 private static final int DEFAULT_FAN_POSITION = 2; 59 private static final float DEFAULT_DRIVER_TEMP = 16; 60 private static final float DEFAULT_PASSENGER_TEMP = 25; 61 62 private final List<CarPropertyConfig> mPropertyList; 63 private final Map<Pair, Object> mProperties = new HashMap<>(); 64 private final List<ICarPropertyEventListener> mListeners = new ArrayList<>(); 65 LocalHvacPropertyService()66 public LocalHvacPropertyService() { 67 CarPropertyConfig fanSpeedConfig = CarPropertyConfig.newBuilder(Integer.class, 68 CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, 69 VehicleAreaType.VEHICLE_AREA_TYPE_ZONE) 70 .addAreaConfig(DEFAULT_AREA_ID, MIN_FAN_SPEED, MAX_FAN_SPEED).build(); 71 72 CarPropertyConfig temperatureConfig = CarPropertyConfig.newBuilder(Float.class, 73 CarHvacManager.ID_ZONED_TEMP_SETPOINT, 74 VehicleAreaType.VEHICLE_AREA_TYPE_ZONE) 75 .addAreaConfig(DEFAULT_AREA_ID, MIN_TEMP, MAX_TEMP).build(); 76 77 mPropertyList = new ArrayList<>(2); 78 mPropertyList.addAll(Arrays.asList(fanSpeedConfig, temperatureConfig)); 79 setupDefaultValues(); 80 } 81 82 private final IBinder mCarPropertyService = new ICarProperty.Stub(){ 83 @Override 84 public void registerListener(ICarPropertyEventListener listener) throws RemoteException { 85 mListeners.add(listener); 86 } 87 88 @Override 89 public void unregisterListener(ICarPropertyEventListener listener) throws RemoteException { 90 mListeners.remove(listener); 91 } 92 93 @Override 94 public List<CarPropertyConfig> getPropertyList() throws RemoteException { 95 return mPropertyList; 96 } 97 98 @Override 99 public CarPropertyValue getProperty(int prop, int zone) throws RemoteException { 100 return new CarPropertyValue(prop, zone, mProperties.get(new Pair(prop, zone))); 101 } 102 103 @Override 104 public void setProperty(CarPropertyValue prop) throws RemoteException { 105 mProperties.put(new Pair(prop.getPropertyId(), prop.getAreaId()), prop.getValue()); 106 for (ICarPropertyEventListener listener : mListeners) { 107 listener.onEvent( 108 new CarPropertyEvent(CarPropertyEvent.PROPERTY_EVENT_PROPERTY_CHANGE, prop)); 109 } 110 } 111 }; 112 getCarPropertyService()113 public IBinder getCarPropertyService() { 114 return mCarPropertyService; 115 } 116 setupDefaultValues()117 private void setupDefaultValues() { 118 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_HVAC_POWER_ON, 119 VehicleZone.ZONE_ROW_1_ALL), DEFAULT_POWER_ON); 120 mProperties.put(new Pair<>(CarHvacManager.ID_WINDOW_DEFROSTER_ON, 121 VehicleWindow.WINDOW_FRONT_WINDSHIELD), DEFAULT_DEFROSTER_ON); 122 mProperties.put(new Pair<>(CarHvacManager.ID_WINDOW_DEFROSTER_ON, 123 VehicleWindow.WINDOW_REAR_WINDSHIELD), DEFAULT_DEFROSTER_ON); 124 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON, 125 VehicleZone.ZONE_ROW_1_ALL), DEFAULT_AIR_CIRCULATION_ON); 126 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_AC_ON, 127 VehicleZone.ZONE_ROW_1_ALL), DEFAULT_AC_ON); 128 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON, 129 VehicleZone.ZONE_ROW_1_ALL), DEFAULT_AUTO_MODE); 130 131 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, 132 VehicleZone.ZONE_ROW_1_ALL), DEFAULT_FAN_SPEED); 133 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_FAN_POSITION, 134 VehicleZone.ZONE_ROW_1_ALL), DEFAULT_FAN_POSITION); 135 136 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_TEMP_SETPOINT, 137 DRIVER_ZONE_ID), DEFAULT_DRIVER_TEMP); 138 mProperties.put(new Pair<>(CarHvacManager.ID_ZONED_TEMP_SETPOINT, 139 PASSENGER_ZONE_ID), DEFAULT_PASSENGER_TEMP); 140 } 141 } 142