diff options
Diffstat (limited to 'service/src/com/android/car/hal/SensorHalService.java')
-rw-r--r-- | service/src/com/android/car/hal/SensorHalService.java | 137 |
1 files changed, 95 insertions, 42 deletions
diff --git a/service/src/com/android/car/hal/SensorHalService.java b/service/src/com/android/car/hal/SensorHalService.java index 2b84fc4ecf..cf29f810cf 100644 --- a/service/src/com/android/car/hal/SensorHalService.java +++ b/service/src/com/android/car/hal/SensorHalService.java @@ -19,6 +19,7 @@ package com.android.car.hal; import static java.lang.Integer.toHexString; import android.annotation.Nullable; +import android.car.hardware.CarSensorConfig; import android.car.hardware.CarSensorEvent; import android.car.hardware.CarSensorManager; import android.hardware.automotive.vehicle.V2_0.VehicleGear; @@ -29,11 +30,13 @@ import android.hardware.automotive.vehicle.V2_1.VehicleProperty; import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess; import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode; import android.hardware.automotive.vehicle.V2_0.VehiclePropertyType; +import android.os.Bundle; import android.util.Log; import android.util.SparseIntArray; import com.android.car.CarLog; import com.android.car.CarSensorEventFactory; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -50,6 +53,7 @@ public class SensorHalService extends SensorHalServiceBase { public interface SensorListener { /** * Sensor events are available. + * * @param events */ void onSensorEvents(List<CarSensorEvent> events); @@ -57,44 +61,44 @@ public class SensorHalService extends SensorHalServiceBase { // Manager property Id to HAL property Id mapping. private final static ManagerToHalPropIdMap mManagerToHalPropIdMap = - ManagerToHalPropIdMap.create( - CarSensorManager.SENSOR_TYPE_CAR_SPEED, VehicleProperty.PERF_VEHICLE_SPEED, - CarSensorManager.SENSOR_TYPE_RPM, VehicleProperty.ENGINE_RPM, - CarSensorManager.SENSOR_TYPE_ODOMETER, VehicleProperty.PERF_ODOMETER, - CarSensorManager.SENSOR_TYPE_GEAR, VehicleProperty.GEAR_SELECTION, - CarSensorManager.SENSOR_TYPE_NIGHT, VehicleProperty.NIGHT_MODE, - CarSensorManager.SENSOR_TYPE_PARKING_BRAKE, VehicleProperty.PARKING_BRAKE_ON, - CarSensorManager.SENSOR_TYPE_DRIVING_STATUS, VehicleProperty.DRIVING_STATUS, - CarSensorManager.SENSOR_TYPE_FUEL_LEVEL, VehicleProperty.FUEL_LEVEL_LOW, - CarSensorManager.SENSOR_TYPE_IGNITION_STATE, VehicleProperty.IGNITION_STATE, - CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE, VehicleProperty.WHEEL_TICK, - CarSensorManager.SENSOR_TYPE_ABS_ACTIVE, VehicleProperty.ABS_ACTIVE, - CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE, - VehicleProperty.TRACTION_CONTROL_ACTIVE - ); + ManagerToHalPropIdMap.create( + CarSensorManager.SENSOR_TYPE_CAR_SPEED, VehicleProperty.PERF_VEHICLE_SPEED, + CarSensorManager.SENSOR_TYPE_RPM, VehicleProperty.ENGINE_RPM, + CarSensorManager.SENSOR_TYPE_ODOMETER, VehicleProperty.PERF_ODOMETER, + CarSensorManager.SENSOR_TYPE_GEAR, VehicleProperty.GEAR_SELECTION, + CarSensorManager.SENSOR_TYPE_NIGHT, VehicleProperty.NIGHT_MODE, + CarSensorManager.SENSOR_TYPE_PARKING_BRAKE, VehicleProperty.PARKING_BRAKE_ON, + CarSensorManager.SENSOR_TYPE_DRIVING_STATUS, VehicleProperty.DRIVING_STATUS, + CarSensorManager.SENSOR_TYPE_FUEL_LEVEL, VehicleProperty.FUEL_LEVEL_LOW, + CarSensorManager.SENSOR_TYPE_IGNITION_STATE, VehicleProperty.IGNITION_STATE, + CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE, VehicleProperty.WHEEL_TICK, + CarSensorManager.SENSOR_TYPE_ABS_ACTIVE, VehicleProperty.ABS_ACTIVE, + CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE, + VehicleProperty.TRACTION_CONTROL_ACTIVE + ); private final static SparseIntArray mMgrGearToHalMap = initSparseIntArray( - VehicleGear.GEAR_NEUTRAL, CarSensorEvent.GEAR_NEUTRAL, - VehicleGear.GEAR_REVERSE, CarSensorEvent.GEAR_REVERSE, - VehicleGear.GEAR_PARK, CarSensorEvent.GEAR_PARK, - VehicleGear.GEAR_DRIVE, CarSensorEvent.GEAR_DRIVE, - VehicleGear.GEAR_LOW, CarSensorEvent.GEAR_FIRST, // Also GEAR_1 - the value is the same. - VehicleGear.GEAR_2, CarSensorEvent.GEAR_SECOND, - VehicleGear.GEAR_3, CarSensorEvent.GEAR_THIRD, - VehicleGear.GEAR_4, CarSensorEvent.GEAR_FOURTH, - VehicleGear.GEAR_5, CarSensorEvent.GEAR_FIFTH, - VehicleGear.GEAR_6, CarSensorEvent.GEAR_SIXTH, - VehicleGear.GEAR_7, CarSensorEvent.GEAR_SEVENTH, - VehicleGear.GEAR_8, CarSensorEvent.GEAR_EIGHTH, - VehicleGear.GEAR_9, CarSensorEvent.GEAR_NINTH); + VehicleGear.GEAR_NEUTRAL, CarSensorEvent.GEAR_NEUTRAL, + VehicleGear.GEAR_REVERSE, CarSensorEvent.GEAR_REVERSE, + VehicleGear.GEAR_PARK, CarSensorEvent.GEAR_PARK, + VehicleGear.GEAR_DRIVE, CarSensorEvent.GEAR_DRIVE, + VehicleGear.GEAR_LOW, CarSensorEvent.GEAR_FIRST, // Also GEAR_1 - the value is the same. + VehicleGear.GEAR_2, CarSensorEvent.GEAR_SECOND, + VehicleGear.GEAR_3, CarSensorEvent.GEAR_THIRD, + VehicleGear.GEAR_4, CarSensorEvent.GEAR_FOURTH, + VehicleGear.GEAR_5, CarSensorEvent.GEAR_FIFTH, + VehicleGear.GEAR_6, CarSensorEvent.GEAR_SIXTH, + VehicleGear.GEAR_7, CarSensorEvent.GEAR_SEVENTH, + VehicleGear.GEAR_8, CarSensorEvent.GEAR_EIGHTH, + VehicleGear.GEAR_9, CarSensorEvent.GEAR_NINTH); private final static SparseIntArray mMgrIgnitionStateToHalMap = initSparseIntArray( - VehicleIgnitionState.UNDEFINED, CarSensorEvent.IGNITION_STATE_UNDEFINED, - VehicleIgnitionState.LOCK, CarSensorEvent.IGNITION_STATE_LOCK, - VehicleIgnitionState.OFF, CarSensorEvent.IGNITION_STATE_OFF, - VehicleIgnitionState.ACC, CarSensorEvent.IGNITION_STATE_ACC, - VehicleIgnitionState.ON, CarSensorEvent.IGNITION_STATE_ON, - VehicleIgnitionState.START, CarSensorEvent.IGNITION_STATE_START); + VehicleIgnitionState.UNDEFINED, CarSensorEvent.IGNITION_STATE_UNDEFINED, + VehicleIgnitionState.LOCK, CarSensorEvent.IGNITION_STATE_LOCK, + VehicleIgnitionState.OFF, CarSensorEvent.IGNITION_STATE_OFF, + VehicleIgnitionState.ACC, CarSensorEvent.IGNITION_STATE_ACC, + VehicleIgnitionState.ON, CarSensorEvent.IGNITION_STATE_ON, + VehicleIgnitionState.START, CarSensorEvent.IGNITION_STATE_START); private SensorListener mSensorListener; @@ -102,15 +106,17 @@ public class SensorHalService extends SensorHalServiceBase { @Override public void init() { + VehiclePropConfig config; // Populate internal values if available - VehiclePropConfig config = mSensorToPropConfig.get( - CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE); + synchronized (this) { + config = mSensorToPropConfig.get(CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE); + } if (config == null) { Log.e(TAG, "init: unable to get property config for SENSOR_TYPE_WHEEL_TICK_DISTANCE"); } else { - for (int i=0; i<4; i++) { - // ConfigArray starts with Wheels enum at idx 0 - mMicrometersPerWheelTick[i] = config.configArray.get(i+1); + for (int i = 0; i < 4; i++) { + mMicrometersPerWheelTick[i] = config.configArray.get(i + + INDEX_WHEEL_DISTANCE_FRONT_LEFT); } } super.init(); @@ -137,6 +143,7 @@ public class SensorHalService extends SensorHalServiceBase { // Should be used only inside handleHalEvents method. private final LinkedList<CarSensorEvent> mEventsToDispatch = new LinkedList<>(); + @Override public void handleHalEvents(List<VehiclePropValue> values) { for (VehiclePropValue v : values) { @@ -165,7 +172,7 @@ public class SensorHalService extends SensorHalServiceBase { mgrValue = mMgrGearToHalMap.get(halValue, -1); break; case VehicleProperty.IGNITION_STATE: - mgrValue = mMgrIgnitionStateToHalMap.get(halValue, -1); + mgrValue = mMgrIgnitionStateToHalMap.get(halValue, -1); default: break; // Do nothing } @@ -192,7 +199,7 @@ public class SensorHalService extends SensorHalServiceBase { break; case VehiclePropertyType.INT32: Integer mgrVal = mapHalEnumValueToMgr(property, v.value.int32Values.get(0)); - event = mgrVal == null ? null + event = mgrVal == null ? null : CarSensorEventFactory.createIntEvent(sensorType, v.timestamp, mgrVal); break; case VehiclePropertyType.FLOAT: @@ -283,4 +290,50 @@ public class SensorHalService extends SensorHalServiceBase { } return map; } -} + + private static final int INDEX_WHEEL_DISTANCE_ENABLE_FLAG = 0; + private static final int INDEX_WHEEL_DISTANCE_FRONT_LEFT = 1; + private static final int INDEX_WHEEL_DISTANCE_FRONT_RIGHT = 2; + private static final int INDEX_WHEEL_DISTANCE_REAR_RIGHT = 3; + private static final int INDEX_WHEEL_DISTANCE_REAR_LEFT = 4; + private static final int WHEEL_TICK_DISTANCE_BUNDLE_SIZE = 6; + + private Bundle createWheelDistanceTickBundle(ArrayList<Integer> configArray) { + Bundle b = new Bundle(WHEEL_TICK_DISTANCE_BUNDLE_SIZE); + b.putInt(CarSensorConfig.WHEEL_TICK_DISTANCE_SUPPORTED_WHEELS, + configArray.get(INDEX_WHEEL_DISTANCE_ENABLE_FLAG)); + b.putInt(CarSensorConfig.WHEEL_TICK_DISTANCE_FRONT_LEFT_UM_PER_TICK, + configArray.get(INDEX_WHEEL_DISTANCE_FRONT_LEFT)); + b.putInt(CarSensorConfig.WHEEL_TICK_DISTANCE_FRONT_RIGHT_UM_PER_TICK, + configArray.get(INDEX_WHEEL_DISTANCE_FRONT_RIGHT)); + b.putInt(CarSensorConfig.WHEEL_TICK_DISTANCE_REAR_RIGHT_UM_PER_TICK, + configArray.get(INDEX_WHEEL_DISTANCE_REAR_RIGHT)); + b.putInt(CarSensorConfig.WHEEL_TICK_DISTANCE_REAR_LEFT_UM_PER_TICK, + configArray.get(INDEX_WHEEL_DISTANCE_REAR_LEFT)); + return b; + } + + + public CarSensorConfig getSensorConfig(int sensorType) { + VehiclePropConfig cfg; + synchronized (this) { + cfg = mSensorToPropConfig.get(sensorType); + } + if (cfg == null) { + /* Invalid sensor type. */ + throw new IllegalArgumentException("Unknown sensorType = " + sensorType); + } else { + Bundle b; + switch(sensorType) { + case CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE: + b = createWheelDistanceTickBundle(cfg.configArray); + break; + default: + /* Unhandled config. Create empty bundle */ + b = Bundle.EMPTY; + break; + } + return new CarSensorConfig(sensorType, b); + } + } +}
\ No newline at end of file |