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