Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5608a2d authored by Calvin Huang's avatar Calvin Huang
Browse files

Override VHAL property init value with json

Bug: 150978133
Test: Manual
Change-Id: Iaa45adad3712ca3cc325d52433048b3208109402
parent a2d2482a
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -16,8 +16,12 @@
#define LOG_TAG "DefaultVehicleHal_v2_0"

#include <android-base/macros.h>
#include <android-base/properties.h>
#include <android/log.h>
#include <dirent.h>
#include <sys/system_properties.h>
#include <fstream>
#include <regex>

#include "EmulatedVehicleHal.h"
#include "JsonFakeValueGenerator.h"
@@ -101,6 +105,30 @@ EmulatedVehicleHal::EmulatedVehicleHal(VehiclePropertyStore* propStore, VehicleH
    mVehicleClient->registerPropertyValueCallback(std::bind(&EmulatedVehicleHal::onPropertyValue,
                                                            this, std::placeholders::_1,
                                                            std::placeholders::_2));

    mInitVhalValueOverride =
            android::base::GetBoolProperty("persist.vendor.vhal_init_value_override", false);
    if (mInitVhalValueOverride) {
        getAllPropertiesOverride();
    }
}

void EmulatedVehicleHal::getAllPropertiesOverride() {
    if (auto dir = opendir("/vendor/etc/vhaloverride/")) {
        std::regex reg_json(".*[.]json", std::regex::icase);
        while (auto f = readdir(dir)) {
            if (!regex_match(f->d_name, reg_json)) {
                continue;
            }
            std::string file = "/vendor/etc/vhaloverride/" + std::string(f->d_name);
            JsonFakeValueGenerator tmpGenerator(file);

            std::vector<VehiclePropValue> propvalues = tmpGenerator.getAllEvents();
            mVehiclePropertiesOverride.insert(std::end(mVehiclePropertiesOverride),
                                              std::begin(propvalues), std::end(propvalues));
        }
        closedir(dir);
    }
}

VehicleHal::VehiclePropValuePtr EmulatedVehicleHal::get(
@@ -277,6 +305,13 @@ void EmulatedVehicleHal::onCreate() {
                }
            } else {
                prop.value = it.initialValue;
                if (mInitVhalValueOverride) {
                    for (auto& itOverride : mVehiclePropertiesOverride) {
                        if (itOverride.prop == cfg.prop) {
                            prop.value = itOverride.value;
                        }
                    }
                }
            }
            mPropStore->writeValue(prop, shouldUpdateStatus);
        }
+3 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ public:
    //  Methods from EmulatedVehicleHalIface
    bool setPropertyFromVehicle(const VehiclePropValue& propValue) override;
    std::vector<VehiclePropValue> getAllProperties() const override;
    void getAllPropertiesOverride();

private:
    constexpr std::chrono::nanoseconds hertzToNanoseconds(float hz) const {
@@ -87,6 +88,8 @@ private:
    RecurrentTimer mRecurrentTimer;
    VehicleHalClient* mVehicleClient;
    bool mInEmulator;
    bool mInitVhalValueOverride;
    std::vector<VehiclePropValue> mVehiclePropertiesOverride;
};

}  // impl
+24 −0
Original line number Diff line number Diff line
@@ -48,6 +48,22 @@ JsonFakeValueGenerator::JsonFakeValueGenerator(const VehiclePropValue& request)
    mNumOfIterations = v.int32Values.size() < 2 ? -1 : v.int32Values[1];
}

JsonFakeValueGenerator::JsonFakeValueGenerator(std::string path) {
    std::ifstream ifs(path);
    if (!ifs) {
        ALOGE("%s: couldn't open %s for parsing.", __func__, path.c_str());
    }
    mGenCfg = {
        .index = 0,
        .events = parseFakeValueJson(ifs),
    };
    mNumOfIterations = mGenCfg.events.size();
}

std::vector<VehiclePropValue> JsonFakeValueGenerator::getAllEvents() {
    return mGenCfg.events;
}

VehiclePropValue JsonFakeValueGenerator::nextEvent() {
    VehiclePropValue generatedValue;
    if (!hasNext()) {
@@ -109,6 +125,7 @@ std::vector<VehiclePropValue> JsonFakeValueGenerator::parseFakeValueJson(std::is

        Json::Value rawEventValue = rawEvent["value"];
        auto& value = event.value;
        int32_t count;
        switch (getPropType(event.prop)) {
            case VehiclePropertyType::BOOLEAN:
            case VehiclePropertyType::INT32:
@@ -126,6 +143,13 @@ std::vector<VehiclePropValue> JsonFakeValueGenerator::parseFakeValueJson(std::is
            case VehiclePropertyType::STRING:
                value.stringValue = rawEventValue.asString();
                break;
            case VehiclePropertyType::INT32_VEC:
                value.int32Values.resize(rawEventValue.size());
                count = 0;
                for (auto& it : rawEventValue) {
                    value.int32Values[count++] = it.asInt();
                }
                break;
            case VehiclePropertyType::MIXED:
                copyMixedValueJson(value, rawEventValue);
                if (isDiagnosticProperty(event.prop)) {
+3 −0
Original line number Diff line number Diff line
@@ -41,9 +41,12 @@ private:

public:
    JsonFakeValueGenerator(const VehiclePropValue& request);
    JsonFakeValueGenerator(std::string path);

    ~JsonFakeValueGenerator() = default;

    VehiclePropValue nextEvent();
    std::vector<VehiclePropValue> getAllEvents();

    bool hasNext();