1ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung/*
2ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Copyright (C) 2015 The Android Open Source Project
3ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung *
4ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Licensed under the Apache License, Version 2.0 (the "License");
5ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * you may not use this file except in compliance with the License.
6ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * You may obtain a copy of the License at
7ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung *
8ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung *      http://www.apache.org/licenses/LICENSE-2.0
9ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung *
10ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Unless required by applicable law or agreed to in writing, software
11ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * distributed under the License is distributed on an "AS IS" BASIS,
12ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * See the License for the specific language governing permissions and
14ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * limitations under the License.
15ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */
16ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
17e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpackage android.car.hardware;
18ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
19ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.Parcel;
20ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoungimport android.os.Parcelable;
21ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
22ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
23ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung/**
24ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * A CarSensorEvent object corresponds to a single sensor event coming from the car. The sensor
25ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * data is stored in a sensor-type specific format in the object's float and byte arrays.
26ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung *
27ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * To aid unmarshalling the object's data arrays, this class provides static nested classes and
28ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * conversion methods, for example {@link EnvironmentData} and {@link #getEnvironmentData}. The
29ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * conversion methods each have an optional data parameter which, if not null, will be used and
30ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * returned. This parameter should be used to avoid unnecessary object churn whenever possible.
31ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * Additionally, calling a conversion method on a CarSensorEvent object with an inappropriate type
32ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung * will result in an {@code UnsupportedOperationException} being thrown.
33ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung */
34e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpublic class CarSensorEvent implements Parcelable {
35ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
36ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
37ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Index in {@link #floatValues} for {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL} type of
38ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * sensor. This value is fuel level in percentile.
39ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
40ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int INDEX_FUEL_LEVEL_IN_PERCENTILE = 0;
41ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
42ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Index in {@link #floatValues} for {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL} type of
434afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park     * sensor. This value is fuel level in coverable distance. The unit is Km.
44ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
45ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int INDEX_FUEL_LEVEL_IN_DISTANCE = 1;
46ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
474afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park     * Index in {@link #intValues} for {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL} type of
484afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park     * sensor. This value is set to 1 if fuel low level warning is on.
49ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
50ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int INDEX_FUEL_LOW_WARNING = 0;
51ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
52ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
53cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung     *  GEAR_* represents meaning of intValues[0] for {@link CarSensorManager#SENSOR_TYPE_GEAR}
54ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *  sensor type.
55ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *  GEAR_NEUTRAL means transmission gear is in neutral state, and the car may be moving.
56ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
57ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_NEUTRAL    = 0;
58ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
59ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * intValues[0] from 1 to 99 represents transmission gear number for moving forward.
60ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * GEAR_FIRST is for gear number 1.
61ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
62ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_FIRST      = 1;
63ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 2. */
64ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_SECOND     = 2;
65ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 3. */
66ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_THIRD      = 3;
67ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 4. */
68ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_FOURTH     = 4;
69ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 5. */
70ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_FIFTH      = 5;
71ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 6. */
72ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_SIXTH      = 6;
73ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 7. */
74ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_SEVENTH    = 7;
75ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 8. */
76ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_EIGHTH     = 8;
77ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 9. */
78ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_NINTH      = 9;
79ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear number 10. */
80ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_TENTH      = 10;
81ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
82ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * This is for transmission without specific gear number for moving forward like CVT. It tells
83ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * that car is in a transmission state to move it forward.
84ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
85ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_DRIVE      = 100;
86ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear in parking state */
87ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_PARK       = 101;
88ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Gear in reverse */
89ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int GEAR_REVERSE    = 102;
90ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
91ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
92ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Bitmask of driving restrictions.
93ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
94ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** No restrictions. */
95ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_UNRESTRICTED = 0;
96ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** No video playback allowed. */
97ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_NO_VIDEO = 0x1;
98ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** No keyboard or rotary controller input allowed. */
99ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_NO_KEYBOARD_INPUT = 0x2;
100ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** No voice input allowed. */
101ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_NO_VOICE_INPUT = 0x4;
102ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** No setup / configuration allowed. */
103ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_NO_CONFIG = 0x8;
104ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Limit displayed message length. */
105ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_LIMIT_MESSAGE_LEN = 0x10;
106ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** represents case where all of the above items are restricted */
107ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int DRIVE_STATUS_FULLY_RESTRICTED = DRIVE_STATUS_NO_VIDEO |
108ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            DRIVE_STATUS_NO_KEYBOARD_INPUT | DRIVE_STATUS_NO_VOICE_INPUT | DRIVE_STATUS_NO_CONFIG |
109ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            DRIVE_STATUS_LIMIT_MESSAGE_LEN;
110ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
111ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
112ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Index for {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT} in floatValues.
113ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Temperature in Celsius degrees.
114ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
115ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int INDEX_ENVIRONMENT_TEMPERATURE = 0;
116ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
117ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Index for {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT} in floatValues.
118ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Pressure in kPa.
119ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
120ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final int INDEX_ENVIRONMENT_PRESSURE = 1;
121ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
122ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    private static final long MILLI_IN_NANOS = 1000000L;
123ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
124ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** Sensor type for this event like {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}. */
125ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public int sensorType;
126ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
127ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
128ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * When this data was acquired in car or received from car. It is elapsed real-time of data
129ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * reception from car in nanoseconds since system boot.
130ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
131ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public long timeStampNs;
132ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
133ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * array holding float type of sensor data. If the sensor has single value, only floatValues[0]
134ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * should be used. */
135ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public final float[] floatValues;
136cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    /** array holding int type of sensor data */
137cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    public final int[] intValues;
138ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
139ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public CarSensorEvent(Parcel in) {
140ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        sensorType = in.readInt();
141ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        timeStampNs = in.readLong();
142ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        int len = in.readInt();
143ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        floatValues = new float[len];
144ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        in.readFloatArray(floatValues);
145ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        len = in.readInt();
146cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        intValues = new int[len];
147cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        in.readIntArray(intValues);
148ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        // version 1 up to here
149ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
150ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
151ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    @Override
152ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public int describeContents() {
153ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return 0;
154ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
155ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
156ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    @Override
157ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public void writeToParcel(Parcel dest, int flags) {
158ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        dest.writeInt(sensorType);
159ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        dest.writeLong(timeStampNs);
160ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        dest.writeInt(floatValues.length);
161ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        dest.writeFloatArray(floatValues);
162cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        dest.writeInt(intValues.length);
163cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        dest.writeIntArray(intValues);
164ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
165ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
166ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static final Parcelable.Creator<CarSensorEvent> CREATOR
167ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    = new Parcelable.Creator<CarSensorEvent>() {
168ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public CarSensorEvent createFromParcel(Parcel in) {
169ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            return new CarSensorEvent(in);
170ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
171ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
172ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public CarSensorEvent[] newArray(int size) {
173ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            return new CarSensorEvent[size];
174ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
175ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    };
176ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
177cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    public CarSensorEvent(int sensorType, long timeStampNs, int floatValueSize, int intValueSize) {
178ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        this.sensorType = sensorType;
179ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        this.timeStampNs = timeStampNs;
180ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        floatValues = new float[floatValueSize];
181cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        intValues = new int[intValueSize];
182ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
183ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
184ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** @hide */
185cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung    CarSensorEvent(int sensorType, long timeStampNs, float[] floatValues, int[] intValues) {
186ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        this.sensorType = sensorType;
187ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        this.timeStampNs = timeStampNs;
188ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        this.floatValues = floatValues;
189cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        this.intValues = intValues;
190ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
191ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
192ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    private void checkType(int type) {
193ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (sensorType == type) {
194ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            return;
195ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
196ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        throw new UnsupportedOperationException(String.format(
197ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung                "Invalid sensor type: expected %d, got %d", type, sensorType));
198ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
199ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
200ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class EnvironmentData {
201ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
202ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        /** If unsupported by the car, this value is NaN. */
203ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public float temperature;
204ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        /** If unsupported by the car, this value is NaN. */
205ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public float pressure;
206ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
207ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
208ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
209ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining an {@link EnvironmentData} object from a CarSensorEvent
210ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT}.
211ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
212ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
213ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
214ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return an EnvironmentData object corresponding to the data contained in the CarSensorEvent.
215ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
216ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public EnvironmentData getEnvironmentData(EnvironmentData data) {
217ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_ENVIRONMENT);
218ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
219ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new EnvironmentData();
220ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
221ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
222ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.temperature = floatValues[INDEX_ENVIRONMENT_TEMPERATURE];
223ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.pressure = floatValues[INDEX_ENVIRONMENT_PRESSURE];
224ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
225ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
226ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
227ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class NightData {
228ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
229ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public boolean isNightMode;
230ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
231ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
232ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
233ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link NightData} object from a CarSensorEvent
234ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_NIGHT}.
235ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
236ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
237ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
238ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a NightData object corresponding to the data contained in the CarSensorEvent.
239ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
240ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public NightData getNightData(NightData data) {
241ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_NIGHT);
242ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
243ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new NightData();
244ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
245ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
246cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        data.isNightMode = intValues[0] == 1;
247ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
248ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
249ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
250ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class GearData {
251ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
252ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public int gear;
253ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
254ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
255ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
256ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link GearData} object from a CarSensorEvent
257ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_GEAR}.
258ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
259ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
260ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
261ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a GearData object corresponding to the data contained in the CarSensorEvent.
262ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
263ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public GearData getGearData(GearData data) {
264ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_GEAR);
265ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
266ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new GearData();
267ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
268ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
269cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        data.gear = intValues[0];
270ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
271ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
272ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
273ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class ParkingBrakeData {
274ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
275ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public boolean isEngaged;
276ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
277ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
278ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
279ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link ParkingBrakeData} object from a CarSensorEvent
280ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_PARKING_BRAKE}.
281ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
282ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
283ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
284ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a ParkingBreakData object corresponding to the data contained in the CarSensorEvent.
285ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
286ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public ParkingBrakeData getParkingBrakeData(ParkingBrakeData data) {
287ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_PARKING_BRAKE);
288ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
289ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new ParkingBrakeData();
290ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
291ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
292cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        data.isEngaged = intValues[0] == 1;
293ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
294ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
295ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
296ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class FuelLevelData {
297ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
2984afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park        /** Fuel level in %. If unsupported by the car, this value is -1. */
299ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public int level;
3004afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park        /** Fuel as possible range in Km. If unsupported by the car, this value is -1. */
3014afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park        public float range;
302ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        /** If unsupported by the car, this value is false. */
303ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public boolean lowFuelWarning;
304ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
305ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
306ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
307ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link FuelLevelData} object from a CarSensorEvent
308ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL}.
309ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
310ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
311ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
312ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a FuelLevel object corresponding to the data contained in the CarSensorEvent.
313ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
314ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public FuelLevelData getFuelLevelData(FuelLevelData data) {
315ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_FUEL_LEVEL);
316ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
317ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new FuelLevelData();
318ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
319ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
3204afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park        if (floatValues == null) {
3214afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            data.level = -1;
3224afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            data.range = -1;
3234afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park        } else {
3244afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            if (floatValues[INDEX_FUEL_LEVEL_IN_PERCENTILE] < 0) {
3254afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park                data.level = -1;
3264afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            } else {
3274afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park                data.level = (int) floatValues[INDEX_FUEL_LEVEL_IN_PERCENTILE];
3284afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            }
3294afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            if (floatValues[INDEX_FUEL_LEVEL_IN_DISTANCE] < 0) {
3304afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park                data.range = -1;
3314afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            } else {
3324afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park                data.range = floatValues[INDEX_FUEL_LEVEL_IN_DISTANCE];
3334afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park            }
3344afc6ee52690326316e2ed1b7bc354f466849426Keun-young Park        }
335cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        data.lowFuelWarning = intValues[0] == 1;
336ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
337ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
338ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
339ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class OdometerData {
340ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
341ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public float kms;
342ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
343ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
344ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
345ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining an {@link OdometerData} object from a CarSensorEvent
346ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_ODOMETER}.
347ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
348ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
349ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
350ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return an OdometerData object corresponding to the data contained in the CarSensorEvent.
351ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
352ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public OdometerData getOdometerData(OdometerData data) {
353ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_ODOMETER);
354ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
355ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new OdometerData();
356ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
357ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
358ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.kms = floatValues[0];
359ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
360ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
361ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
362ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class RpmData {
363ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
364ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public float rpm;
365ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
366ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
367ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
368ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link RpmData} object from a CarSensorEvent
369ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_RPM}.
370ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
371ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
372ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
373ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a RpmData object corresponding to the data contained in the CarSensorEvent.
374ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
375ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public RpmData getRpmData(RpmData data) {
376ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_RPM);
377ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
378ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new RpmData();
379ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
380ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
381ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.rpm = floatValues[0];
382ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
383ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
384ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
385ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class CarSpeedData {
386ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
387ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public float carSpeed;
388ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
389ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
390ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
391ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link CarSpeedData} object from a CarSensorEvent
392ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}.
393ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
394ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
395ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
396ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a CarSpeedData object corresponding to the data contained in the CarSensorEvent.
397ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
398ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public CarSpeedData getCarSpeedData(CarSpeedData data) {
399ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_CAR_SPEED);
400ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
401ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new CarSpeedData();
402ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
403ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.timeStampNs = timeStampNs;
404ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        data.carSpeed = floatValues[0];
405ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
406ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
407ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
408ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public static class DrivingStatusData {
409ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        public long timeStampNs;
410cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        public int status;
411ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
412ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
413ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /**
414ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * Convenience method for obtaining a {@link DrivingStatusData} object from a CarSensorEvent
415ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * object with type {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}.
416ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *
417ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @param data an optional output parameter which, if non-null, will be used by this method
418ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     *     instead of a newly created object.
419ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     * @return a DrivingStatusData object corresponding to the data contained in the CarSensorEvent.
420ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung     */
421ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public DrivingStatusData getDrivingStatusData(DrivingStatusData data) {
422ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        checkType(CarSensorManager.SENSOR_TYPE_DRIVING_STATUS);
423ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (data == null) {
424ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            data = new DrivingStatusData();
425ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
426cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        data.status = intValues[0];
427ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return data;
428ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
429ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung
430ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    /** @hide */
431ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    @Override
432ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    public String toString() {
433ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        StringBuilder sb = new StringBuilder();
434ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        sb.append(getClass().getName() + "[");
435ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        sb.append("type:" + Integer.toHexString(sensorType));
436ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        if (floatValues != null && floatValues.length > 0) {
437ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            sb.append(" float values:");
438ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            for (float v: floatValues) {
439ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung                sb.append(" " + v);
440ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            }
441ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
442cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung        if (intValues != null && intValues.length > 0) {
443cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung            sb.append(" int values:");
444cc449f7941456a0133ff8a4b2e49737f0936c1d0keunyoung            for (int v: intValues) {
445ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung                sb.append(" " + v);
446ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung            }
447ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        }
448ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        sb.append("]");
449ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung        return sb.toString();
450ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung    }
451ca515079e9fc0c35b1498830f67378e9ccf949e5keunyoung}
452