16648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik/* 26648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * Copyright (C) 2015 The Android Open Source Project 36648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * 46648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * Licensed under the Apache License, Version 2.0 (the "License"); 56648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * you may not use this file except in compliance with the License. 66648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * You may obtain a copy of the License at 76648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * 86648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * http://www.apache.org/licenses/LICENSE-2.0 96648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * 106648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * Unless required by applicable law or agreed to in writing, software 116648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * distributed under the License is distributed on an "AS IS" BASIS, 126648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * See the License for the specific language governing permissions and 146648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik * limitations under the License. 156648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik */ 166648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikpackage com.android.car.hal; 176648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 18bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport static com.android.car.hal.CarPropertyUtils.toCarPropertyValue; 19bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport static com.android.car.hal.CarPropertyUtils.toVehiclePropValue; 20bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport static java.lang.Integer.toHexString; 216648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 22bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport android.car.hardware.CarPropertyConfig; 23bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport android.car.hardware.CarPropertyValue; 24e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.car.hardware.hvac.CarHvacEvent; 25bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport android.car.hardware.hvac.CarHvacManager.HvacPropertyId; 26ba48548a489950968d212ffbfd8772ef1349cd60Keun-young Parkimport android.os.ServiceSpecificException; 27e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsevimport android.util.Log; 28bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport android.util.SparseIntArray; 296648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 30e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsevimport com.android.car.CarLog; 316648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport com.android.car.vehiclenetwork.VehicleNetworkConsts; 326648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig; 336648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue; 346648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 356648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport java.io.PrintWriter; 366648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport java.util.ArrayList; 376648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport java.util.HashMap; 386648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport java.util.LinkedList; 396648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikimport java.util.List; 406648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 416648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paikpublic class HvacHalService extends HalServiceBase { 426648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private static final boolean DBG = true; 436648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private static final String TAG = CarLog.TAG_HVAC + ".HvacHalService"; 446648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private HvacHalListener mListener; 456648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private final VehicleHal mVehicleHal; 46bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik 47bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik private final HashMap<Integer, CarPropertyConfig<?>> mProps = new HashMap<>(); 48bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik private final SparseIntArray mHalPropToValueType = new SparseIntArray(); 496648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 506648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public interface HvacHalListener { 516648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik void onPropertyChange(CarHvacEvent event); 526648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik void onError(int zone, int property); 536648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 546648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 556648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public HvacHalService(VehicleHal vehicleHal) { 566648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik mVehicleHal = vehicleHal; 576648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik if (DBG) { 586648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik Log.d(TAG, "started HvacHalService!"); 596648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 606648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 616648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 626648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public void setListener(HvacHalListener listener) { 636648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik synchronized (this) { 646648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik mListener = listener; 656648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 666648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 676648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 68bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik public List<CarPropertyConfig> getHvacProperties() { 69bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik List<CarPropertyConfig> propList; 706648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik synchronized (mProps) { 71e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev propList = new ArrayList<>(mProps.values()); 726648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 736648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik return propList; 746648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 756648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 76bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik public CarPropertyValue getHvacProperty(int hvacPropertyId, int areaId) { 77bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik int halProp = hvacToHalPropId(hvacPropertyId); 786648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 79ba48548a489950968d212ffbfd8772ef1349cd60Keun-young Park VehiclePropValue value = null; 80ba48548a489950968d212ffbfd8772ef1349cd60Keun-young Park try { 81bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik VehiclePropValue valueRequest = VehiclePropValue.newBuilder() 82bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik .setProp(halProp) 83bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik .setZone(areaId) 84bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik .setValueType(mHalPropToValueType.get(halProp)) 85bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik .build(); 866648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 87bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik value = mVehicleHal.getVehicleNetwork().getProperty(valueRequest); 88bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik } catch (ServiceSpecificException e) { 89bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik Log.e(CarLog.TAG_HVAC, "property not ready 0x" + toHexString(halProp), e); 906648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 916648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 92bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return value == null ? null : toCarPropertyValue(value, hvacPropertyId); 936648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 946648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 95bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik public void setHvacProperty(CarPropertyValue prop) { 96bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik VehiclePropValue halProp = toVehiclePropValue(prop, hvacToHalPropId(prop.getPropertyId())); 97bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik mVehicleHal.getVehicleNetwork().setProperty(halProp); 986648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 996648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1006648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik @Override 1016648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public void init() { 1026648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik if (DBG) { 1036648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik Log.d(TAG, "init()"); 1046648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1056648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik synchronized (mProps) { 1066648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik // Subscribe to each of the HVAC properties 1076648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik for (Integer prop : mProps.keySet()) { 1086648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik mVehicleHal.subscribeProperty(this, prop, 0); 1096648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1106648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1116648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1126648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1136648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik @Override 1146648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public void release() { 1156648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik if (DBG) { 1166648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik Log.d(TAG, "release()"); 1176648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1186648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik synchronized (mProps) { 1196648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik for (Integer prop : mProps.keySet()) { 1206648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik mVehicleHal.unsubscribeProperty(this, prop); 1216648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1226648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1236648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik // Clear the property list 1246648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik mProps.clear(); 1256648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1266648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik mListener = null; 1276648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1286648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1296648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik @Override 1306648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public synchronized List<VehiclePropConfig> takeSupportedProperties( 1316648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik List<VehiclePropConfig> allProperties) { 132e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev List<VehiclePropConfig> taken = new LinkedList<>(); 1336648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1346648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik for (VehiclePropConfig p : allProperties) { 135e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev int hvacPropId; 1366648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik try { 137bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik hvacPropId = halToHvacPropId(p.getProp()); 1386648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } catch (IllegalArgumentException e) { 139bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik Log.i(TAG, "Property not supported by HVAC: 0x" + toHexString(p.getProp())); 1406648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik continue; 1416648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 142bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik CarPropertyConfig hvacConfig = CarPropertyUtils.toCarPropertyConfig(p, hvacPropId); 1436648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 144bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik taken.add(p); 145bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik mProps.put(p.getProp(), hvacConfig); 146bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik mHalPropToValueType.put(p.getProp(), p.getValueType()); 147e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev 148bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik if (DBG) { 149bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik Log.d(TAG, "takeSupportedProperties: " + toHexString(p.getProp())); 1506648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1516648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1526648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik return taken; 1536648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1546648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1556648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik @Override 1566648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public void handleHalEvents(List<VehiclePropValue> values) { 157e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev HvacHalListener listener; 1586648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik synchronized (this) { 1596648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik listener = mListener; 1606648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1616648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik if (listener != null) { 1626648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik dispatchEventToListener(listener, values); 1636648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1646648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1656648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1666648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private void dispatchEventToListener(HvacHalListener listener, List<VehiclePropValue> values) { 1676648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik for (VehiclePropValue v : values) { 1686648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik int prop = v.getProp(); 1696648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 170bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik int hvacPropId; 171bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik try { 172bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik hvacPropId = halToHvacPropId(prop); 173bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik } catch (IllegalArgumentException ex) { 174bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik Log.e(TAG, "Property is not supported: 0x" + toHexString(prop), ex); 175bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik continue; 176bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik } 1776648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 178bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik CarHvacEvent event; 179bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik CarPropertyValue<?> hvacProperty = toCarPropertyValue(v, hvacPropId); 180bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE, hvacProperty); 1816648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 182bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik listener.onPropertyChange(event); 183bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik if (DBG) { 184bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik Log.d(TAG, "handleHalEvents event: " + event); 1856648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1866648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1876648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1886648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1896648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik @Override 1906648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik public void dump(PrintWriter writer) { 1916648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik writer.println("*HVAC HAL*"); 1926648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik writer.println(" Properties available:"); 193bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik for (CarPropertyConfig prop : mProps.values()) { 194450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park writer.println(" " + prop.toString()); 1956648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1966648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 1976648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 1986648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik // Convert the HVAC public API property ID to HAL property ID 1996648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private static int hvacToHalPropId(int hvacPropId) { 2006648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik switch (hvacPropId) { 201bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik case HvacPropertyId.ZONED_FAN_SPEED_SETPOINT: 202bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED; 203bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik case HvacPropertyId.ZONED_FAN_POSITION: 204bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION; 205bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik case HvacPropertyId.ZONED_TEMP_ACTUAL: 206bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT; 207bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik case HvacPropertyId.ZONED_TEMP_SETPOINT: 208bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET; 209bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik case HvacPropertyId.WINDOW_DEFROSTER_ON: 210bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER; 211bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik case HvacPropertyId.ZONED_AC_ON: 212bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AC_ON; 2134fff3d5cc4112a341c331688bda9fcb65ed9016aKeun-young Park case HvacPropertyId.ZONED_AIR_RECIRCULATION_ON: 2144fff3d5cc4112a341c331688bda9fcb65ed9016aKeun-young Park return VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_RECIRC_ON; 215bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik default: 216bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik throw new IllegalArgumentException("hvacPropId " + hvacPropId + " is not supported"); 2176648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 2186648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 2196648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik 2206648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik // Convert he HAL specific property ID to HVAC public API 2216648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik private static int halToHvacPropId(int halPropId) { 2226648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik switch (halPropId) { 2236648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED: 224bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return HvacPropertyId.ZONED_FAN_SPEED_SETPOINT; 2256648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION: 226bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return HvacPropertyId.ZONED_FAN_POSITION; 2276648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT: 228bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return HvacPropertyId.ZONED_TEMP_ACTUAL; 2296648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET: 230bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return HvacPropertyId.ZONED_TEMP_SETPOINT; 2316648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER: 232bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return HvacPropertyId.WINDOW_DEFROSTER_ON; 2336648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AC_ON: 234bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik return HvacPropertyId.ZONED_AC_ON; 2354fff3d5cc4112a341c331688bda9fcb65ed9016aKeun-young Park case VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_RECIRC_ON: 2364fff3d5cc4112a341c331688bda9fcb65ed9016aKeun-young Park return HvacPropertyId.ZONED_AIR_RECIRCULATION_ON; 237bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik default: 238bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik throw new IllegalArgumentException("halPropId " + halPropId + " is not supported"); 2396648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 2406648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik } 2416648198ce8f3129886038d9c80b63b96b8a0ee3eSteve Paik} 242