Teach Vehicle HAL a way to indicate which subset of OBD2 sensors are valid for a given frame.

We are now using the "bytes" element of VehiclePropValue::RawValue as a storage place for a bitmask that indicates
which sensor indices, among those defined, actually map to valid values in the int32Values and floatValues respectively.

Test: make vts BUILD_GOOGLE_VTS=true -j32 && vts-tradefed run commandAndExit vts --skip-all-system-status-check --primary-abi-only --skip-preconditions --module VehicleHidlTest -l INFO
Test: adb root && adb push out/target/product/bat/data/nativetest/android.hardware.vehicle@2.0-manager-unit-tests/android.hardware.vehicle@2.0-manager-unit-tests /data/nativetest/android.hardware.vehicle@2.0-manager-unit-tests/android.hardware.vehicle@2.0-manager-unit-tests && adb shell /data/nativetest/android.hardware.vehicle@2.0-manager-unit-tests/android.hardware.vehicle@2.0-manager-unit-tests | grep Obd2
Change-Id: I4e9a116555001d2577d50d50009f75d8f78603b0
diff --git a/vehicle/2.0/default/impl/DefaultConfig.h b/vehicle/2.0/default/impl/DefaultConfig.h
index 12c1c1b..f4e1e53 100644
--- a/vehicle/2.0/default/impl/DefaultConfig.h
+++ b/vehicle/2.0/default/impl/DefaultConfig.h
@@ -165,12 +165,14 @@
         .prop = VehicleProperty::OBD2_LIVE_FRAME,
         .access = VehiclePropertyAccess::READ,
         .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
+        .configArray = {0,0}
     },
 
     {
         .prop = VehicleProperty::OBD2_FREEZE_FRAME,
         .access = VehiclePropertyAccess::READ,
         .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
+        .configArray = {0,0}
     }
 };
 
diff --git a/vehicle/2.0/default/impl/DefaultVehicleHal.cpp b/vehicle/2.0/default/impl/DefaultVehicleHal.cpp
index 4541168..73789e1 100644
--- a/vehicle/2.0/default/impl/DefaultVehicleHal.cpp
+++ b/vehicle/2.0/default/impl/DefaultVehicleHal.cpp
@@ -16,6 +16,8 @@
 
 #include "DefaultVehicleHal.h"
 
+#include <algorithm>
+
 #define LOG_TAG "default_vehicle"
 #include <android/log.h>
 
@@ -153,6 +155,96 @@
     return status;
 }
 
+void DefaultVehicleHal::onCreate() {
+    const auto& propConfigs(listProperties());
+    auto obd2LiveFramePropConfig = std::find_if(
+        propConfigs.begin(),
+        propConfigs.end(),
+        [] (VehiclePropConfig config) -> bool {
+            return (config.prop == VehicleProperty::OBD2_LIVE_FRAME);
+        });
+    mObd2SensorStore.reset(new Obd2SensorStore(
+        obd2LiveFramePropConfig->configArray[0],
+        obd2LiveFramePropConfig->configArray[1]));
+    // precalculate OBD2 sensor values
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::FUEL_SYSTEM_STATUS,
+        toInt(FuelSystemStatus::CLOSED_LOOP));
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::IGNITION_MONITORS_SUPPORTED,
+        toInt(IgnitionMonitorKind::SPARK));
+    mObd2SensorStore->setIntegerSensor(Obd2IntegerSensorIndex::IGNITION_SPECIFIC_MONITORS,
+        CommonIgnitionMonitors::COMPONENTS_AVAILABLE |
+        CommonIgnitionMonitors::MISFIRE_AVAILABLE |
+        SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE |
+        SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS,
+        toInt(SecondaryAirStatus::FROM_OUTSIDE_OR_OFF));
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1);
+    mObd2SensorStore->setIntegerSensor(
+        Obd2IntegerSensorIndex::FUEL_TYPE, toInt(FuelType::GASOLINE));
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::ENGINE_RPM, 1250.);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::VEHICLE_SPEED, 40.);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::TIMING_ADVANCE, 2.5);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::THROTTLE_POSITION, 19.75);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, -0.373);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, 190.);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094);
+    mObd2SensorStore->setFloatSensor(
+        Obd2FloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024);
+}
+
 StatusCode DefaultVehicleHal::getHvacTemperature(int32_t areaId,
                                                  float* outValue)  {
     if (areaId == toInt(VehicleAreaZone::ROW_1_LEFT)) {
@@ -205,73 +297,17 @@
     return StatusCode::OK;
 }
 
-static std::vector<int32_t> fillObd2IntValues() {
-    std::vector<int32_t> intValues(toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX));
-#define SENSOR(name) toInt(Obd2IntegerSensorIndex:: name)
-    intValues[SENSOR(FUEL_SYSTEM_STATUS)] = toInt(FuelSystemStatus::CLOSED_LOOP);
-    intValues[SENSOR(MALFUNCTION_INDICATOR_LIGHT_ON)] = 0;
-    intValues[SENSOR(IGNITION_MONITORS_SUPPORTED)] = toInt(IgnitionMonitorKind::SPARK);
-    intValues[SENSOR(IGNITION_SPECIFIC_MONITORS)] =
-        CommonIgnitionMonitors::COMPONENTS_AVAILABLE |
-        CommonIgnitionMonitors::MISFIRE_AVAILABLE |
-        SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE |
-        SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE;
-    intValues[SENSOR(INTAKE_AIR_TEMPERATURE)] = 35;
-    intValues[SENSOR(COMMANDED_SECONDARY_AIR_STATUS)] =
-        toInt(SecondaryAirStatus::FROM_OUTSIDE_OR_OFF);
-    intValues[SENSOR(NUM_OXYGEN_SENSORS_PRESENT)] = 1;
-    intValues[SENSOR(RUNTIME_SINCE_ENGINE_START)] = 500;
-    intValues[SENSOR(DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON)] = 0;
-    intValues[SENSOR(WARMUPS_SINCE_CODES_CLEARED)] = 51;
-    intValues[SENSOR(DISTANCE_TRAVELED_SINCE_CODES_CLEARED)] = 365;
-    intValues[SENSOR(ABSOLUTE_BAROMETRIC_PRESSURE)] = 30;
-    intValues[SENSOR(CONTROL_MODULE_VOLTAGE)] = 12;
-    intValues[SENSOR(AMBIENT_AIR_TEMPERATURE)] = 18;
-    intValues[SENSOR(MAX_FUEL_AIR_EQUIVALENCE_RATIO)] = 1;
-    intValues[SENSOR(FUEL_TYPE)] = toInt(FuelType::GASOLINE);
-#undef SENSOR
-    return intValues;
-}
-
-static std::vector<float> fillObd2FloatValues() {
-    std::vector<float> floatValues(toInt(Obd2FloatSensorIndex::LAST_SYSTEM_INDEX));
-#define SENSOR(name) toInt(Obd2FloatSensorIndex:: name)
-    floatValues[SENSOR(CALCULATED_ENGINE_LOAD)] = 0.153;
-    floatValues[SENSOR(SHORT_TERM_FUEL_TRIM_BANK1)] = -0.16;
-    floatValues[SENSOR(LONG_TERM_FUEL_TRIM_BANK1)] = -0.16;
-    floatValues[SENSOR(SHORT_TERM_FUEL_TRIM_BANK2)] = -0.16;
-    floatValues[SENSOR(LONG_TERM_FUEL_TRIM_BANK2)] = -0.16;
-    floatValues[SENSOR(INTAKE_MANIFOLD_ABSOLUTE_PRESSURE)] = 7.5;
-    floatValues[SENSOR(ENGINE_RPM)] = 1250.;
-    floatValues[SENSOR(VEHICLE_SPEED)] = 40.;
-    floatValues[SENSOR(TIMING_ADVANCE)] = 2.5;
-    floatValues[SENSOR(THROTTLE_POSITION)] = 19.75;
-    floatValues[SENSOR(OXYGEN_SENSOR1_VOLTAGE)] = 0.265;
-    floatValues[SENSOR(FUEL_TANK_LEVEL_INPUT)] = 0.824;
-    floatValues[SENSOR(EVAPORATION_SYSTEM_VAPOR_PRESSURE)] = -0.373;
-    floatValues[SENSOR(CATALYST_TEMPERATURE_BANK1_SENSOR1)] = 190.;
-    floatValues[SENSOR(RELATIVE_THROTTLE_POSITION)] = 3.;
-    floatValues[SENSOR(ABSOLUTE_THROTTLE_POSITION_B)] = 0.306;
-    floatValues[SENSOR(ACCELERATOR_PEDAL_POSITION_D)] = 0.188;
-    floatValues[SENSOR(ACCELERATOR_PEDAL_POSITION_E)] = 0.094;
-    floatValues[SENSOR(COMMANDED_THROTTLE_ACTUATOR)] = 0.024;
-#undef SENSOR
-    return floatValues;
-}
-
 StatusCode DefaultVehicleHal::fillObd2LiveFrame(VehiclePropValuePtr* v) {
-    static std::vector<int32_t> intValues(fillObd2IntValues());
-    static std::vector<float> floatValues(fillObd2FloatValues());
-    (*v)->value.int32Values = intValues;
-    (*v)->value.floatValues = floatValues;
+    (*v)->value.int32Values = mObd2SensorStore->getIntegerSensors();
+    (*v)->value.floatValues = mObd2SensorStore->getFloatSensors();
+    (*v)->value.bytes = mObd2SensorStore->getSensorsBitmask();
     return StatusCode::OK;
 }
 
 StatusCode DefaultVehicleHal::fillObd2FreezeFrame(VehiclePropValuePtr* v) {
-    static std::vector<int32_t> intValues(fillObd2IntValues());
-    static std::vector<float> floatValues(fillObd2FloatValues());
-    (*v)->value.int32Values = intValues;
-    (*v)->value.floatValues = floatValues;
+    (*v)->value.int32Values = mObd2SensorStore->getIntegerSensors();
+    (*v)->value.floatValues = mObd2SensorStore->getFloatSensors();
+    (*v)->value.bytes = mObd2SensorStore->getSensorsBitmask();
     (*v)->value.stringValue = "P0010";
     return StatusCode::OK;
 }
diff --git a/vehicle/2.0/default/impl/DefaultVehicleHal.h b/vehicle/2.0/default/impl/DefaultVehicleHal.h
index 15a4789..165324e 100644
--- a/vehicle/2.0/default/impl/DefaultVehicleHal.h
+++ b/vehicle/2.0/default/impl/DefaultVehicleHal.h
@@ -17,8 +17,11 @@
 #ifndef android_hardware_vehicle_V2_0_impl_DefaultVehicleHal_H_
 #define android_hardware_vehicle_V2_0_impl_DefaultVehicleHal_H_
 
+#include <memory>
+
 #include <VehicleHal.h>
 #include <impl/DefaultConfig.h>
+#include <vehicle_hal_manager/Obd2SensorStore.h>
 #include <utils/SystemClock.h>
 
 namespace android {
@@ -38,6 +41,8 @@
     VehiclePropValuePtr get(const VehiclePropValue& requestedPropValue,
                             StatusCode* outStatus) override;
 
+    void onCreate() override;
+
     StatusCode set(const VehiclePropValue& propValue) override;
 
     StatusCode subscribe(VehicleProperty property,
@@ -57,8 +62,8 @@
     StatusCode setHvacTemperature(int32_t areaId, float value);
     StatusCode getHvacDefroster(int32_t areaId, bool* outValue);
     StatusCode setHvacDefroster(int32_t areaId, bool value);
-    StatusCode fillObd2LiveFrame (VehiclePropValuePtr* v);
-    StatusCode fillObd2FreezeFrame (VehiclePropValuePtr* v);
+    StatusCode fillObd2LiveFrame(VehiclePropValuePtr* v);
+    StatusCode fillObd2FreezeFrame(VehiclePropValuePtr* v);
 private:
     int32_t mFanSpeed = 3;
     int32_t mBrightness = 7;
@@ -71,6 +76,7 @@
     bool mHvacAcOn = true;
     bool mHvacAutoOn = true;
     VehicleHvacFanDirection mFanDirection = VehicleHvacFanDirection::FACE;
+    std::unique_ptr<Obd2SensorStore> mObd2SensorStore{nullptr};
 };
 
 }  // impl