11ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung/*
21ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Copyright (C) 2015 The Android Open Source Project
31ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung *
41ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Licensed under the Apache License, Version 2.0 (the "License");
51ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * you may not use this file except in compliance with the License.
61ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * You may obtain a copy of the License at
71ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung *
81ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung *      http://www.apache.org/licenses/LICENSE-2.0
91ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung *
101ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Unless required by applicable law or agreed to in writing, software
111ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * distributed under the License is distributed on an "AS IS" BASIS,
121ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * See the License for the specific language governing permissions and
141ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * limitations under the License.
151ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung */
161ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungpackage com.android.car.vehiclenetwork;
171ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
18bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paikimport com.google.protobuf.ByteString;
19bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik
201ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
211ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
22e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
23e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsevimport java.util.Arrays;
24e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsevimport java.util.List;
25e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
261ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung/**
271ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Utility class to help creating VehiclePropValue.
281ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung */
29e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsevpublic final class VehiclePropValueUtil {
30e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
31e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    /** To prevent creating of utility class */
32e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    private VehiclePropValueUtil() {}
331ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
341ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createIntValue(int property, int value, long timestamp) {
35e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_INT32, timestamp).
361ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                addInt32Values(value).
371ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
381ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
391ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
401ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createIntVectorValue(int property, int[] values,
411ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            long timestamp) {
4271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        VehiclePropValue.Builder builder = createBuilder(property,
43e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                getVectorValueType(VehicleValueType.VEHICLE_VALUE_TYPE_INT32, values.length),
441ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                timestamp);
451ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        for (int v : values) {
461ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            builder.addInt32Values(v);
471ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        }
481ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        return builder.build();
491ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
501ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
511ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createFloatValue(int property, float value, long timestamp) {
52e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT, timestamp).
531ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                addFloatValues(value).
541ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
551ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
561ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
571ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createFloatVectorValue(int property, float[] values,
581ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            long timestamp) {
5971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        VehiclePropValue.Builder builder = createBuilder(property,
60e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                getVectorValueType(VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT, values.length),
611ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                timestamp);
621ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        for (float v : values) {
631ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            builder.addFloatValues(v);
641ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        }
651ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        return builder.build();
661ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
671ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
681ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createLongValue(int property, long value, long timestamp) {
69e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_INT64, timestamp).
701ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                setInt64Value(value).
711ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
721ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
731ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
741ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createStringValue(int property, String value, long timestamp) {
75e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_STRING, timestamp).
761ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                setStringValue(value).
771ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
781ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
791ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
801ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createBooleanValue(int property, boolean value, long timestamp) {
81e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN, timestamp).
821ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                addInt32Values(value ? 1 : 0).
831ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
841ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
851ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
861ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createBytesValue(int property, byte[] value, long timestamp) {
87e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_BYTES, timestamp).
881ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                setBytesValue(ByteString.copyFrom(value)).
891ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
901ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
911ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
921ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createZonedIntValue(int property, int zone, int value,
931ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            long timestamp) {
94e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, timestamp).
9571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                setZone(zone).
9671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                addInt32Values(value).
971ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
981ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
991ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
100e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static VehiclePropValue createZonedIntVectorValue(int property, int zone, int[] values,
101e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            long timestamp) {
102e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        int valueType = getVectorValueType(
103e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, values.length);
10471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        VehiclePropValue.Builder builder = createBuilder(property, valueType, timestamp).
10571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                setZone(zone);
10671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        for (int value : values) {
10771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            builder.addInt32Values(value);
10871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        }
10971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        return builder.build();
110e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
111e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
112e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static VehiclePropValue createZonedFloatVectorValue(int property, int zone,
113e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            float[] values, long timestamp) {
114e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        int valueType = getVectorValueType(
115e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT, values.length);
11671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        VehiclePropValue.Builder builder =  createBuilder(property, valueType, timestamp).
11771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                setZone(zone);
11871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        for (float value : values) {
11971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            builder.addFloatValues(value);
12071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        }
12171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        return builder.build();
122e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
123e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
124e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
1251ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createZonedBooleanValue(int property, int zone, boolean value,
1261ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            long timestamp) {
1271ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,timestamp).
12871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                setZone(zone).
12971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                addInt32Values(value ? 1 : 0).
1301ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
1311ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
1321ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
1331ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createZonedFloatValue(int property, int zone, float value,
1341ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            long timestamp) {
1351ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,timestamp).
13671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                setZone(zone).
13771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                addFloatValues(value).
1381ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                build();
1391ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
1401ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
1411ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue createDummyValue(int property, int valueType) {
1421ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        switch (valueType) {
1431ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_STRING: {
1441ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createStringValue(property, "dummy", 0);
1451ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1461ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_BYTES: {
1471ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createBytesValue(property, new byte[1], 0);
1481ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1491ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN: {
1501ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createBooleanValue(property, false, 0);
1511ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1521ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32: {
1531ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createZonedIntValue(property, 0, 0, 0);
1541ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1551ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
1561ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createZonedFloatValue(property, 0, 0, 0);
1571ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1581ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
1591ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createZonedBooleanValue(property, 0, false, 0);
1601ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1611ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_INT64: {
1621ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createLongValue(property, 0, 0);
1631ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1641ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT: {
1651ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createFloatValue(property, 0, 0);
1661ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
167e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2:
168e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
169e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
170e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
17171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
17271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:{
173e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                return createFloatVectorValue(property, new float[getVectorLength(valueType)], 0);
1741ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
1751ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32: {
1761ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                return createIntValue(property, 0, 0);
1771ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
178e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2:
179e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
180e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
181e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
18271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
18371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
184e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                return createIntVectorValue(property, new int[getVectorLength(valueType)], 0);
1851ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            }
186e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
1871ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        }
1881ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        return null;
1891ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
1901ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
1911ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public static VehiclePropValue.Builder createBuilder(int property, int valueType,
1921ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung            long timestamp) {
1931ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        return VehiclePropValue.newBuilder().
1941ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                setProp(property).
1951ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                setValueType(valueType).
1961ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                setTimestamp(timestamp);
1971ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
198e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
199e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static int getVectorLength(int vehicleValueType) {
200e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        switch (vehicleValueType) {
201bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            case VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN:
202bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32:
203bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT:
204bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32:
205bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
206bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT:
207bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik                return 1;
208e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2:
209e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2:
210e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
211e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
212e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                return 2;
213e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
214e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
215e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
216e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
217e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                return 3;
218e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
219e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
22071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
22171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
222e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                return 4;
223e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            default:
224e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                throw new IllegalArgumentException("Unknown value type: " + vehicleValueType);
225e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        }
226e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
227e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
228e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static boolean isCustomProperty(int property) {
229e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return property >= VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START &&
230e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                property <= VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_END;
231e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
232e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
233e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    /** Converts {@link VehiclePropValue} to string just for debug purpose. */
234e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static String toString(VehiclePropValue value) {
235bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik        if (value == null) {
236bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik            return String.valueOf(null);
237bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik        }
238e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return new StringBuilder()
239e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("prop: " + value.getProp() + "\n")
240e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("valueType: " + value.getValueType() + "\n")
241e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("timestamp: " + value.getTimestamp() + "\n")
242e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("int32Values: " + Arrays.toString(toIntArray(value.getInt32ValuesList()))
243e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                        + "\n")
244e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("int64Value: " + value.getInt64Value() + "\n")
245e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("floatValues: " + Arrays.toString(toFloatArray(value.getFloatValuesList()))
246e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                        + "\n")
247e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("stringValue: " + value.getStringValue() + "\n")
248e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .append("byteValue: " + Arrays.toString(value.getBytesValue().toByteArray()) + "\n")
24971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                .append("zone: {" + value.getZone() + "}")
250e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev                .toString();
251e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
252e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
253e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static int[] toIntArray(List<Integer> collection) {
254e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        int[] array = new int[collection.size()];
255e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        int i = 0;
256e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        for (int value : collection) {
257e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            array[i++] = value;
258e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        }
259e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return array;
260e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
261e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
262e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    public static float[] toFloatArray(List<Float> collection) {
263e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        float[] array = new float[collection.size()];
264e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        int i = 0;
265e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        for (float value : collection) {
266e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev            array[i++] = value;
267e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        }
268e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return array;
269e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
270e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev
271bf52d5bfd313ae33cdeb3c0b6252df9d153d6bebSteve Paik    public static int getVectorValueType(int vehicleValueType, int length) {
272e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev        return vehicleValueType + length - 1;
273e8f7537867d58983addacd9c43383c43eabe798aPavel Maltsev    }
2741ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung}
275