1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.car.hardware;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 /**
23  * A CarSensorEvent object corresponds to a single sensor event coming from the car. The sensor
24  * data is stored in a sensor-type specific format in the object's float and byte arrays.
25  *
26  * To aid unmarshalling the object's data arrays, this class provides static nested classes and
27  * conversion methods. The conversion methods each have an optional data parameter which,
28  * if not null, will be used and returned. This parameter should be used to avoid unnecessary
29  * object churn whenever possible. Additionally, calling a conversion method on a CarSensorEvent
30  * object with an inappropriate type will result in an {@code UnsupportedOperationException}
31  * being thrown.
32  *
33  * @deprecated consider using {@link CarPropertyValue} and
34  * {@link android.car.hardware.property.CarPropertyManager} instead.
35  */
36 @Deprecated
37 public class CarSensorEvent implements Parcelable {
38 
39     /**
40      *  GEAR_* represents meaning of intValues[0] for {@link CarSensorManager#SENSOR_TYPE_GEAR}
41      *  sensor type.
42      *  GEAR_NEUTRAL means transmission gear is in neutral state, and the car may be moving.
43      */
44     public static final int GEAR_NEUTRAL    = 0x0001;
45     /**
46      * intValues[0] from 1 to 99 represents transmission gear number for moving forward.
47      * GEAR_FIRST is for gear number 1.
48      */
49     public static final int GEAR_FIRST      = 0x0010;
50     /** Gear number 2. */
51     public static final int GEAR_SECOND     = 0x0020;
52     /** Gear number 3. */
53     public static final int GEAR_THIRD      = 0x0040;
54     /** Gear number 4. */
55     public static final int GEAR_FOURTH     = 0x0080;
56     /** Gear number 5. */
57     public static final int GEAR_FIFTH      = 0x0100;
58     /** Gear number 6. */
59     public static final int GEAR_SIXTH      = 0x0200;
60     /** Gear number 7. */
61     public static final int GEAR_SEVENTH    = 0x0400;
62     /** Gear number 8. */
63     public static final int GEAR_EIGHTH     = 0x0800;
64     /** Gear number 9. */
65     public static final int GEAR_NINTH      = 0x1000;
66     /** Gear number 10. */
67     public static final int GEAR_TENTH      = 0x2000;
68     /**
69      * This is for transmission without specific gear number for moving forward like CVT. It tells
70      * that car is in a transmission state to move it forward.
71      */
72     public static final int GEAR_DRIVE      = 0x0008;
73     /** Gear in parking state */
74     public static final int GEAR_PARK       = 0x0004;
75     /** Gear in reverse */
76     public static final int GEAR_REVERSE    = 0x0002;
77 
78     /**
79      * Ignition state is unknown.
80      *
81      * The constants that starts with IGNITION_STATE_ represent values for
82      * {@link CarSensorManager#SENSOR_TYPE_IGNITION_STATE} sensor.
83      * */
84     public static final int IGNITION_STATE_UNDEFINED = 0;
85     /**
86      * Steering wheel is locked.
87      */
88     public static final int IGNITION_STATE_LOCK = 1;
89     /** Typically engine is off, but steering wheel is unlocked. */
90     public static final int IGNITION_STATE_OFF = 2;
91     /** Accessory is turned off, but engine is not running yet (for EV car is not ready to move). */
92     public static final int IGNITION_STATE_ACC = 3;
93     /** In this state engine typically is running (for EV, car is ready to move). */
94     public static final int IGNITION_STATE_ON = 4;
95     /** In this state engine is typically starting (cranking). */
96     public static final int IGNITION_STATE_START = 5;
97 
98     /**
99      * Index for {@link CarSensorManager#SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE} in floatValues.
100      * Temperature in Celsius degrees.
101      */
102     public static final int INDEX_ENVIRONMENT_TEMPERATURE = 0;
103 
104     /**
105      * Index for {@link CarSensorManager#SENSOR_TYPE_WHEEL_TICK_DISTANCE} in longValues. RESET_COUNT
106      * is incremented whenever the HAL detects that a sensor reset has occurred.  It represents to
107      * the upper layer that the WHEEL_DISTANCE values will not be contiguous with other values
108      * reported with a different RESET_COUNT.
109      */
110     public static final int INDEX_WHEEL_DISTANCE_RESET_COUNT = 0;
111     public static final int INDEX_WHEEL_DISTANCE_FRONT_LEFT = 1;
112     public static final int INDEX_WHEEL_DISTANCE_FRONT_RIGHT = 2;
113     public static final int INDEX_WHEEL_DISTANCE_REAR_RIGHT = 3;
114     public static final int INDEX_WHEEL_DISTANCE_REAR_LEFT = 4;
115 
116     private static final long MILLI_IN_NANOS = 1000000L;
117 
118     /** Sensor type for this event like {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}. */
119     public int sensorType;
120 
121     /**
122      * When this data was received from car. It is elapsed real-time of data reception from car in
123      * nanoseconds since system boot.
124      */
125     public long timestamp;
126     /**
127      * array holding float type of sensor data. If the sensor has single value, only floatValues[0]
128      * should be used. */
129     public final float[] floatValues;
130     /** array holding int type of sensor data */
131     public final int[] intValues;
132     /** array holding long int type of sensor data */
133     public final long[] longValues;
134 
135     /** @hide */
CarSensorEvent(Parcel in)136     public CarSensorEvent(Parcel in) {
137         sensorType = in.readInt();
138         timestamp = in.readLong();
139         int len = in.readInt();
140         floatValues = new float[len];
141         in.readFloatArray(floatValues);
142         len = in.readInt();
143         intValues = new int[len];
144         in.readIntArray(intValues);
145         // version 1 up to here
146         len = in.readInt();
147         longValues = new long[len];
148         in.readLongArray(longValues);
149     }
150 
151     @Override
describeContents()152     public int describeContents() {
153         return 0;
154     }
155 
156     @Override
writeToParcel(Parcel dest, int flags)157     public void writeToParcel(Parcel dest, int flags) {
158         dest.writeInt(sensorType);
159         dest.writeLong(timestamp);
160         dest.writeInt(floatValues.length);
161         dest.writeFloatArray(floatValues);
162         dest.writeInt(intValues.length);
163         dest.writeIntArray(intValues);
164         dest.writeInt(longValues.length);
165         dest.writeLongArray(longValues);
166     }
167 
168     public static final Parcelable.Creator<CarSensorEvent> CREATOR =
169             new Parcelable.Creator<CarSensorEvent>() {
170         public CarSensorEvent createFromParcel(Parcel in) {
171             return new CarSensorEvent(in);
172         }
173 
174         public CarSensorEvent[] newArray(int size) {
175             return new CarSensorEvent[size];
176         }
177     };
178 
179     /** @hide */
CarSensorEvent(int sensorType, long timestamp, int floatValueSize, int intValueSize, int longValueSize)180     public CarSensorEvent(int sensorType, long timestamp, int floatValueSize, int intValueSize,
181                           int longValueSize) {
182         this.sensorType = sensorType;
183         this.timestamp = timestamp;
184         floatValues = new float[floatValueSize];
185         intValues = new int[intValueSize];
186         longValues = new long[longValueSize];
187     }
188 
189     /** @hide */
CarSensorEvent(int sensorType, long timestamp, float[] floatValues, int[] intValues, long[] longValues)190     CarSensorEvent(int sensorType, long timestamp, float[] floatValues, int[] intValues,
191                    long[] longValues) {
192         this.sensorType = sensorType;
193         this.timestamp = timestamp;
194         this.floatValues = floatValues;
195         this.intValues = intValues;
196         this.longValues = longValues;
197     }
198 
checkType(int type)199     private void checkType(int type) {
200         if (sensorType == type) {
201             return;
202         }
203         throw new UnsupportedOperationException(String.format(
204                 "Invalid sensor type: expected %d, got %d", type, sensorType));
205     }
206 
207     /**
208      * Environment data with timestamp and temperature.
209      */
210     public static class EnvironmentData {
211         public long timestamp;
212         /** If unsupported by the car, this value is NaN. */
213         public float temperature;
214 
215         /** @hide */
EnvironmentData()216         private EnvironmentData() {};
217     }
218 
219     /**
220      * Convenience method for obtaining an {@link EnvironmentData} object from a CarSensorEvent
221      * object with type {@link CarSensorManager#SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE}.
222      *
223      * @param data an optional output parameter which, if non-null, will be used by this method
224      *     instead of a newly created object.
225      * @return an EnvironmentData object corresponding to the data contained in the CarSensorEvent.
226      * @hide
227      */
getEnvironmentData(EnvironmentData data)228     public EnvironmentData getEnvironmentData(EnvironmentData data) {
229         checkType(CarSensorManager.SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE);
230         if (data == null) {
231             data = new EnvironmentData();
232         }
233         data.timestamp = timestamp;
234         data.temperature = floatValues[INDEX_ENVIRONMENT_TEMPERATURE];
235         return data;
236     }
237 
238     /** @hide*/
239     public static class IgnitionStateData {
240         public long timestamp;
241         public int ignitionState;
242 
243         /** @hide */
IgnitionStateData()244         private IgnitionStateData() {};
245     }
246 
247     /**
248      * Convenience method for obtaining a {@link IgnitionStateData} object from a CarSensorEvent
249      * object with type {@link CarSensorManager#SENSOR_TYPE_IGNITION_STATE}.
250      *
251      * @param data an optional output parameter which, if non-null, will be used by this method
252      *     instead of a newly created object.
253      * @return a IgnitionStateData object corresponding to the data contained in the CarSensorEvent.
254      * @hide
255      */
getIgnitionStateData(IgnitionStateData data)256     public IgnitionStateData getIgnitionStateData(IgnitionStateData data) {
257         checkType(CarSensorManager.SENSOR_TYPE_IGNITION_STATE);
258         if (data == null) {
259             data = new IgnitionStateData();
260         }
261         data.timestamp = timestamp;
262         data.ignitionState = intValues[0];
263         return data;
264     }
265 
266     /** @hide */
267     public static class NightData {
268         public long timestamp;
269         public boolean isNightMode;
270 
271         /** @hide */
NightData()272         private NightData() {};
273     }
274 
275     /**
276      * Convenience method for obtaining a {@link NightData} object from a CarSensorEvent
277      * object with type {@link CarSensorManager#SENSOR_TYPE_NIGHT}.
278      *
279      * @param data an optional output parameter which, if non-null, will be used by this method
280      *     instead of a newly created object.
281      * @return a NightData object corresponding to the data contained in the CarSensorEvent.
282      * @hide
283      */
getNightData(NightData data)284     public NightData getNightData(NightData data) {
285         checkType(CarSensorManager.SENSOR_TYPE_NIGHT);
286         if (data == null) {
287             data = new NightData();
288         }
289         data.timestamp = timestamp;
290         data.isNightMode = intValues[0] == 1;
291         return data;
292     }
293 
294     /** @hide */
295     public static class GearData {
296         public long timestamp;
297         public int gear;
298 
299         /** @hide */
GearData()300         private GearData() {};
301     }
302 
303     /**
304      * Convenience method for obtaining a {@link GearData} object from a CarSensorEvent
305      * object with type {@link CarSensorManager#SENSOR_TYPE_GEAR}.
306      *
307      * @param data an optional output parameter which, if non-null, will be used by this method
308      *     instead of a newly created object.
309      * @return a GearData object corresponding to the data contained in the CarSensorEvent.
310      * @hide
311      */
getGearData(GearData data)312     public GearData getGearData(GearData data) {
313         checkType(CarSensorManager.SENSOR_TYPE_GEAR);
314         if (data == null) {
315             data = new GearData();
316         }
317         data.timestamp = timestamp;
318         data.gear = intValues[0];
319         return data;
320     }
321 
322     /** @hide */
323     public static class ParkingBrakeData {
324         public long timestamp;
325         public boolean isEngaged;
326 
327         /** @hide */
ParkingBrakeData()328         private ParkingBrakeData() {}
329     }
330 
331     /**
332      * Convenience method for obtaining a {@link ParkingBrakeData} object from a CarSensorEvent
333      * object with type {@link CarSensorManager#SENSOR_TYPE_PARKING_BRAKE}.
334      *
335      * @param data an optional output parameter which, if non-null, will be used by this method
336      *     instead of a newly created object.
337      * @return a ParkingBreakData object corresponding to the data contained in the CarSensorEvent.
338      * @hide
339      */
getParkingBrakeData(ParkingBrakeData data)340     public ParkingBrakeData getParkingBrakeData(ParkingBrakeData data) {
341         checkType(CarSensorManager.SENSOR_TYPE_PARKING_BRAKE);
342         if (data == null) {
343             data = new ParkingBrakeData();
344         }
345         data.timestamp = timestamp;
346         data.isEngaged = intValues[0] == 1;
347         return data;
348     }
349 
350     /** @hide */
351     public static class FuelLevelData {
352         public long timestamp;
353         /** Fuel level in milliliters.  Negative values indicate this property is unsupported. */
354         public float level;
355 
356         /** @hide */
FuelLevelData()357         private FuelLevelData() {};
358     }
359 
360     /**
361      * Convenience method for obtaining a {@link FuelLevelData} object from a CarSensorEvent
362      * object with type {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL}.
363      *
364      * @param data an optional output parameter which, if non-null, will be used by this method
365      *     instead of a newly created object.
366      * @return a FuelLevel object corresponding to the data contained in the CarSensorEvent.
367      * @hide
368      */
getFuelLevelData(FuelLevelData data)369     public FuelLevelData getFuelLevelData(FuelLevelData data) {
370         checkType(CarSensorManager.SENSOR_TYPE_FUEL_LEVEL);
371         if (data == null) {
372             data = new FuelLevelData();
373         }
374         data.timestamp = timestamp;
375         if (floatValues == null) {
376             data.level = -1.0f;
377         } else {
378             if (floatValues[0] < 0) {
379                 data.level = -1.0f;
380             } else {
381                 data.level = floatValues[0];
382             }
383         }
384         return data;
385     }
386 
387     /** @hide */
388     public static class OdometerData {
389         public long timestamp;
390         public float kms;
391 
392         /** @hide */
OdometerData()393         private OdometerData() {};
394     }
395 
396     /**
397      * Convenience method for obtaining an {@link OdometerData} object from a CarSensorEvent
398      * object with type {@link CarSensorManager#SENSOR_TYPE_ODOMETER}.
399      *
400      * @param data an optional output parameter which, if non-null, will be used by this method
401      *     instead of a newly created object.
402      * @return an OdometerData object corresponding to the data contained in the CarSensorEvent.
403      * @hide
404      */
getOdometerData(OdometerData data)405     public OdometerData getOdometerData(OdometerData data) {
406         checkType(CarSensorManager.SENSOR_TYPE_ODOMETER);
407         if (data == null) {
408             data = new OdometerData();
409         }
410         data.timestamp = timestamp;
411         data.kms = floatValues[0];
412         return data;
413     }
414 
415     /** @hide */
416     public static class RpmData {
417         public long timestamp;
418         public float rpm;
419 
420         /** @hide */
RpmData()421         private RpmData() {};
422     }
423 
424     /**
425      * Convenience method for obtaining a {@link RpmData} object from a CarSensorEvent
426      * object with type {@link CarSensorManager#SENSOR_TYPE_RPM}.
427      *
428      * @param data an optional output parameter which, if non-null, will be used by this method
429      *     instead of a newly created object.
430      * @return a RpmData object corresponding to the data contained in the CarSensorEvent.
431      * @hide
432      */
getRpmData(RpmData data)433     public RpmData getRpmData(RpmData data) {
434         checkType(CarSensorManager.SENSOR_TYPE_RPM);
435         if (data == null) {
436             data = new RpmData();
437         }
438         data.timestamp = timestamp;
439         data.rpm = floatValues[0];
440         return data;
441     }
442 
443     /** @hide */
444     public static class CarSpeedData {
445         public long timestamp;
446         public float carSpeed;
447 
448         /** @hide */
CarSpeedData()449         private CarSpeedData() {};
450     }
451 
452     /**
453      * Convenience method for obtaining a {@link CarSpeedData} object from a CarSensorEvent
454      * object with type {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}.
455      *
456      * @param data an optional output parameter which, if non-null, will be used by this method
457      *     instead of a newly created object.
458      * @return a CarSpeedData object corresponding to the data contained in the CarSensorEvent.
459      * @hide
460      */
getCarSpeedData(CarSpeedData data)461     public CarSpeedData getCarSpeedData(CarSpeedData data) {
462         checkType(CarSensorManager.SENSOR_TYPE_CAR_SPEED);
463         if (data == null) {
464             data = new CarSpeedData();
465         }
466         data.timestamp = timestamp;
467         data.carSpeed = floatValues[0];
468         return data;
469     }
470 
471     /** @hide */
472     public static class CarWheelTickDistanceData {
473         public long timestamp;
474         public long sensorResetCount;
475         public long frontLeftWheelDistanceMm;
476         public long frontRightWheelDistanceMm;
477         public long rearRightWheelDistanceMm;
478         public long rearLeftWheelDistanceMm;
479 
480         /** @hide */
CarWheelTickDistanceData()481         private CarWheelTickDistanceData() {};
482     }
483 
484     /**
485      * Convenience method for obtaining a {@link CarWheelTickDistanceData} object from a
486      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_WHEEL_TICK_DISTANCE}.
487      *
488      * @param data an optional output parameter which, if non-null, will be used by this method
489      *     instead of a newly created object.
490      * @return CarWheelTickDistanceData object corresponding to data contained in the CarSensorEvent
491      * @hide
492      */
getCarWheelTickDistanceData(CarWheelTickDistanceData data)493     public CarWheelTickDistanceData getCarWheelTickDistanceData(CarWheelTickDistanceData data) {
494         checkType(CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE);
495         if (data == null) {
496             data = new CarWheelTickDistanceData();
497         }
498         data.timestamp = timestamp;
499         data.sensorResetCount = longValues[INDEX_WHEEL_DISTANCE_RESET_COUNT];
500         data.frontLeftWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_FRONT_LEFT];
501         data.frontRightWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_FRONT_RIGHT];
502         data.rearRightWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_REAR_RIGHT];
503         data.rearLeftWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_REAR_LEFT];
504         return data;
505     }
506 
507     /** @hide */
508     public static class CarAbsActiveData {
509         public long timestamp;
510         public boolean absIsActive;
511 
512         /** @hide */
CarAbsActiveData()513         private CarAbsActiveData() {};
514     }
515 
516     /**
517      * Convenience method for obtaining a {@link CarAbsActiveData} object from a CarSensorEvent
518      * object with type {@link CarSensorManager#SENSOR_TYPE_ABS_ACTIVE}.
519      *
520      * @param data an optional output parameter which, if non-null, will be used by this method
521      *     instead of a newly created object.
522      * @return a CarAbsActiveData object corresponding to data contained in the CarSensorEvent.
523      * @hide
524      */
getCarAbsActiveData(CarAbsActiveData data)525     public CarAbsActiveData getCarAbsActiveData(CarAbsActiveData data) {
526         checkType(CarSensorManager.SENSOR_TYPE_ABS_ACTIVE);
527         if (data == null) {
528             data = new CarAbsActiveData();
529         }
530         data.timestamp = timestamp;
531         data.absIsActive = intValues[0] == 1;
532         return data;
533     }
534 
535     /** @hide */
536     public static class CarTractionControlActiveData {
537         public long timestamp;
538         public boolean tractionControlIsActive;
539 
540         /** @hide */
CarTractionControlActiveData()541         private CarTractionControlActiveData() {};
542     }
543 
544     /**
545      * Convenience method for obtaining a {@link CarTractionControlActiveData} object from a
546      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_TRACTION_CONTROL_ACTIVE}.
547      *
548      * @param data an optional output parameter which, if non-null, will be used by this method
549      *     instead of a newly created object.
550      * @return a CarTractionControlActiveData object corresponding to data contained in the
551      *     CarSensorEvent.
552      * @hide
553      */
getCarTractionControlActiveData( CarTractionControlActiveData data)554     public CarTractionControlActiveData getCarTractionControlActiveData(
555             CarTractionControlActiveData data) {
556         checkType(CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE);
557         if (data == null) {
558             data = new CarTractionControlActiveData();
559         }
560         data.timestamp = timestamp;
561         data.tractionControlIsActive = intValues[0] == 1;
562         return data;
563     }
564 
565     /** @hide */
566     public static class CarFuelDoorOpenData {
567         public long timestamp;
568         public boolean fuelDoorIsOpen;
569 
570         /** @hide */
CarFuelDoorOpenData()571         private CarFuelDoorOpenData() {};
572     }
573 
574     /**
575      * Convenience method for obtaining a {@link CarFuelDoorOpenData} object from a
576      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_FUEL_DOOR_OPEN}.
577      *
578      * @param data an optional output parameter which, if non-null, will be used by this method
579      *     instead of a newly created object.
580      * @return a CarFuelDoorOpenData object corresponding to data contained in the
581      *     CarSensorEvent.
582      * @hide
583      */
getCarFuelDoorOpenData(CarFuelDoorOpenData data)584     public CarFuelDoorOpenData getCarFuelDoorOpenData(CarFuelDoorOpenData data) {
585         checkType(CarSensorManager.SENSOR_TYPE_FUEL_DOOR_OPEN);
586         if (data == null) {
587             data = new CarFuelDoorOpenData();
588         }
589         data.timestamp = timestamp;
590         data.fuelDoorIsOpen = intValues[0] == 1;
591         return data;
592     }
593 
594     /** @hide */
595     public static class CarEvBatteryLevelData {
596         public long timestamp;
597         /** Battery Level in Watt-hours */
598         public float evBatteryLevel;
599 
600         /** @hide */
CarEvBatteryLevelData()601         private CarEvBatteryLevelData() {};
602     }
603 
604     /**
605      * Convenience method for obtaining a {@link CarEvBatteryLevelData} object from a
606      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_BATTERY_LEVEL}.
607      *
608      * @param data an optional output parameter which, if non-null, will be used by this method
609      *     instead of a newly created object.
610      * @return a CarEvBatteryLevelData object corresponding to data contained in the
611      *     CarSensorEvent.
612      * @hide
613      */
getCarEvBatteryLevelData(CarEvBatteryLevelData data)614     public CarEvBatteryLevelData getCarEvBatteryLevelData(CarEvBatteryLevelData data) {
615         checkType(CarSensorManager.SENSOR_TYPE_EV_BATTERY_LEVEL);
616         if (data == null) {
617             data = new CarEvBatteryLevelData();
618         }
619         data.timestamp = timestamp;
620         if (floatValues == null) {
621             data.evBatteryLevel = -1.0f;
622         } else {
623             if (floatValues[0] < 0) {
624                 data.evBatteryLevel = -1.0f;
625             } else {
626                 data.evBatteryLevel = floatValues[0];
627             }
628         }
629         return data;
630     }
631 
632     /** @hide */
633     public static class CarEvChargePortOpenData {
634         public long timestamp;
635         public boolean evChargePortIsOpen;
636 
637         /** @hide */
CarEvChargePortOpenData()638         private CarEvChargePortOpenData() {};
639     }
640 
641     /**
642      * Convenience method for obtaining a {@link CarEvChargePortOpenData} object from a
643      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_CHARGE_PORT_OPEN}.
644      *
645      * @param data an optional output parameter which, if non-null, will be used by this method
646      *     instead of a newly created object.
647      * @return a CarEvChargePortOpenData object corresponding to data contained in the
648      *     CarSensorEvent.
649      * @hide
650      */
getCarEvChargePortOpenData(CarEvChargePortOpenData data)651     public CarEvChargePortOpenData getCarEvChargePortOpenData(CarEvChargePortOpenData data) {
652         checkType(CarSensorManager.SENSOR_TYPE_EV_CHARGE_PORT_OPEN);
653         if (data == null) {
654             data = new CarEvChargePortOpenData();
655         }
656         data.timestamp = timestamp;
657         data.evChargePortIsOpen = intValues[0] == 1;
658         return data;
659     }
660 
661     /** @hide */
662     public static class CarEvChargePortConnectedData {
663         public long timestamp;
664         public boolean evChargePortIsConnected;
665 
666         /** @hide */
CarEvChargePortConnectedData()667         private CarEvChargePortConnectedData() {};
668     }
669 
670     /**
671      * Convenience method for obtaining a {@link CarEvChargePortConnectedData} object from a
672      * CarSensorEvent with type {@link CarSensorManager#SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED}.
673      *
674      * @param data an optional output parameter which, if non-null, will be used by this method
675      *     instead of a newly created object.
676      * @return a CarEvChargePortConnectedData object corresponding to data contained in the
677      *     CarSensorEvent.
678      * @hide
679      */
getCarEvChargePortConnectedData( CarEvChargePortConnectedData data)680     public CarEvChargePortConnectedData getCarEvChargePortConnectedData(
681             CarEvChargePortConnectedData data) {
682         checkType(CarSensorManager.SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED);
683         if (data == null) {
684             data = new CarEvChargePortConnectedData();
685         }
686         data.timestamp = timestamp;
687         data.evChargePortIsConnected = intValues[0] == 1;
688         return data;
689     }
690 
691     /** @hide */
692     public static class CarEvBatteryChargeRateData {
693         public long timestamp;
694         /** EV battery charging rate in mW.
695          * Positive values indicates battery being charged.  Negative values indicate discharge */
696         public float evChargeRate;
697 
698         /** @hide */
CarEvBatteryChargeRateData()699         private CarEvBatteryChargeRateData() {};
700     }
701 
702     /**
703      * Convenience method for obtaining a {@link CarEvBatteryChargeRateData} object from a
704      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_BATTERY_CHARGE_RATE}.
705      *
706      * @param data an optional output parameter which, if non-null, will be used by this method
707      *     instead of a newly created object.
708      * @return a CarEvBatteryChargeRateData object corresponding to data contained in the
709      *     CarSensorEvent.
710      * @hide
711      */
getCarEvBatteryChargeRateData( CarEvBatteryChargeRateData data)712     public CarEvBatteryChargeRateData getCarEvBatteryChargeRateData(
713             CarEvBatteryChargeRateData data) {
714         checkType(CarSensorManager.SENSOR_TYPE_EV_BATTERY_CHARGE_RATE);
715         if (data == null) {
716             data = new CarEvBatteryChargeRateData();
717         }
718         data.timestamp = timestamp;
719         data.evChargeRate = floatValues[0];
720         return data;
721     }
722 
723     /** @hide */
724     public static class CarEngineOilLevelData {
725         public long timestamp;
726         public int engineOilLevel;
727 
728         /** @hide */
CarEngineOilLevelData()729         private CarEngineOilLevelData() {};
730     }
731 
732     /**
733      * Convenience method for obtaining a {@link CarEngineOilLevelData} object from a
734      * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL}.
735      *
736      * @param data an optional output parameter, which, if non-null, will be used by this method
737      *      instead of a newly created object.
738      * @return a CarEngineOilLEvelData object corresponding to data contained in the CarSensorEvent.
739      * @hide
740      */
getCarEngineOilLevelData(CarEngineOilLevelData data)741     public CarEngineOilLevelData getCarEngineOilLevelData(CarEngineOilLevelData data) {
742         checkType(CarSensorManager.SENSOR_TYPE_ENGINE_OIL_LEVEL);
743         if (data == null) {
744             data = new CarEngineOilLevelData();
745         }
746         data.timestamp = timestamp;
747         data.engineOilLevel = intValues[0];
748         return data;
749     }
750 
751     /** @hide */
752     @Override
toString()753     public String toString() {
754         StringBuilder sb = new StringBuilder();
755         sb.append(getClass().getName() + "[");
756         sb.append("type:" + Integer.toHexString(sensorType));
757         if (floatValues != null && floatValues.length > 0) {
758             sb.append(" float values:");
759             for (float v: floatValues) {
760                 sb.append(" " + v);
761             }
762         }
763         if (intValues != null && intValues.length > 0) {
764             sb.append(" int values:");
765             for (int v: intValues) {
766                 sb.append(" " + v);
767             }
768         }
769         if (longValues != null && longValues.length > 0) {
770             sb.append(" long values:");
771             for (long v: longValues) {
772                 sb.append(" " + v);
773             }
774         }
775         sb.append("]");
776         return sb.toString();
777     }
778 }
779