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