Move Emulated User HAL to Emulated Vehicle Connector Class

Test: build; manually tested the following commands
```
> adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle/default --user-hal
> adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle/default --set 299896583 a 1 i 666 i 1 i 11
```
Bug: 166706927
Change-Id: Ic5774e56dec7febcfeaf496111ba77907e1b7fac

Change-Id: Ib2545b7e0d6b2eea0734fe013451b1365ee0e8ff
Merged-In: Ib2545b7e0d6b2eea0734fe013451b1365ee0e8ff
(cherry picked from commit 872784629b)
This commit is contained in:
Hao Chen
2020-09-24 17:23:02 -07:00
parent be5dec4265
commit bc2d16b9f5
6 changed files with 41 additions and 43 deletions

View File

@@ -137,7 +137,6 @@ cc_library_static {
local_include_dirs: ["common/include/vhal_v2_0"],
export_include_dirs: ["impl"],
srcs: [
"impl/vhal_v2_0/EmulatedUserHal.cpp",
"impl/vhal_v2_0/GeneratorHub.cpp",
"impl/vhal_v2_0/JsonFakeValueGenerator.cpp",
"impl/vhal_v2_0/LinearFakeValueGenerator.cpp",

View File

@@ -33,7 +33,7 @@ using namespace android::hardware::automotive::vehicle::V2_0;
int main(int /* argc */, char* /* argv */ []) {
auto store = std::make_unique<VehiclePropertyStore>();
auto connector = impl::makeEmulatedPassthroughConnector();
auto connector = std::make_unique<impl::EmulatedVehicleConnector>();
auto hal = std::make_unique<impl::EmulatedVehicleHal>(store.get(), connector.get());
auto emulator = std::make_unique<impl::VehicleEmulator>(hal.get());
auto service = std::make_unique<VehicleHalManager>(hal.get());

View File

@@ -35,13 +35,33 @@ namespace V2_0 {
namespace impl {
class EmulatedPassthroughConnector : public PassthroughConnector {
public:
bool onDump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override;
};
EmulatedUserHal* EmulatedVehicleConnector::getEmulatedUserHal() {
return &mEmulatedUserHal;
}
bool EmulatedPassthroughConnector::onDump(const hidl_handle& handle,
const hidl_vec<hidl_string>& options) {
StatusCode EmulatedVehicleConnector::onSetProperty(const VehiclePropValue& value,
bool updateStatus) {
if (mEmulatedUserHal.isSupported(value.prop)) {
LOG(INFO) << "onSetProperty(): property " << value.prop << " will be handled by UserHal";
const auto& ret = mEmulatedUserHal.onSetProperty(value);
if (!ret.ok()) {
LOG(ERROR) << "onSetProperty(): HAL returned error: " << ret.error().message();
return StatusCode(ret.error().code());
}
auto updatedValue = ret.value().get();
if (updatedValue != nullptr) {
LOG(INFO) << "onSetProperty(): updating property returned by HAL: "
<< toString(*updatedValue);
onPropertyValueFromCar(*updatedValue, updateStatus);
}
return StatusCode::OK;
}
return this->VehicleHalServer::onSetProperty(value, updateStatus);
}
bool EmulatedVehicleConnector::onDump(const hidl_handle& handle,
const hidl_vec<hidl_string>& options) {
int fd = handle->data[0];
if (options.size() > 0) {
@@ -68,10 +88,6 @@ bool EmulatedPassthroughConnector::onDump(const hidl_handle& handle,
return true;
}
PassthroughConnectorPtr makeEmulatedPassthroughConnector() {
return std::make_unique<EmulatedPassthroughConnector>();
}
} // namespace impl
} // namespace V2_0

View File

@@ -19,6 +19,7 @@
#include <vhal_v2_0/VehicleConnector.h>
#include "EmulatedUserHal.h"
#include "VehicleHalClient.h"
#include "VehicleHalServer.h"
@@ -30,10 +31,20 @@ namespace V2_0 {
namespace impl {
using PassthroughConnector = IPassThroughConnector<VehicleHalClient, VehicleHalServer>;
using PassthroughConnectorPtr = std::unique_ptr<PassthroughConnector>;
class EmulatedVehicleConnector : public IPassThroughConnector<VehicleHalClient, VehicleHalServer> {
public:
EmulatedVehicleConnector() {}
PassthroughConnectorPtr makeEmulatedPassthroughConnector();
EmulatedUserHal* getEmulatedUserHal();
// Methods from VehicleHalServer
StatusCode onSetProperty(const VehiclePropValue& value, bool updateStatus) override;
bool onDump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override;
private:
EmulatedUserHal mEmulatedUserHal;
};
} // namespace impl

View File

@@ -41,10 +41,6 @@ VehiclePropValuePool* VehicleHalServer::getValuePool() const {
return mValuePool;
}
EmulatedUserHal* VehicleHalServer::getEmulatedUserHal() {
return &mEmulatedUserHal;
}
void VehicleHalServer::setValuePool(VehiclePropValuePool* valuePool) {
if (!valuePool) {
LOG(WARNING) << __func__ << ": Setting value pool to nullptr!";
@@ -185,22 +181,6 @@ VehicleHalServer::VehiclePropValuePtr VehicleHalServer::createHwInputKeyProp(
}
StatusCode VehicleHalServer::onSetProperty(const VehiclePropValue& value, bool updateStatus) {
if (mEmulatedUserHal.isSupported(value.prop)) {
LOG(INFO) << "onSetProperty(): property " << value.prop << " will be handled by UserHal";
const auto& ret = mEmulatedUserHal.onSetProperty(value);
if (!ret.ok()) {
LOG(ERROR) << "onSetProperty(): HAL returned error: " << ret.error().message();
return StatusCode(ret.error().code());
}
auto updatedValue = ret.value().get();
if (updatedValue != nullptr) {
LOG(INFO) << "onSetProperty(): updating property returned by HAL: "
<< toString(*updatedValue);
onPropertyValueFromCar(*updatedValue, updateStatus);
}
return StatusCode::OK;
}
LOG(DEBUG) << "onSetProperty(" << value.prop << ")";
// Some properties need to be treated non-trivially

View File

@@ -19,7 +19,6 @@
#include <vhal_v2_0/VehicleObjectPool.h>
#include <vhal_v2_0/VehicleServer.h>
#include "EmulatedUserHal.h"
#include "GeneratorHub.h"
namespace android::hardware::automotive::vehicle::V2_0::impl {
@@ -38,8 +37,6 @@ class VehicleHalServer : public IVehicleServer {
// Set the Property Value Pool used in this server
void setValuePool(VehiclePropValuePool* valuePool);
EmulatedUserHal* getEmulatedUserHal();
private:
using VehiclePropValuePtr = recyclable_ptr<VehiclePropValue>;
@@ -56,11 +53,6 @@ class VehicleHalServer : public IVehicleServer {
VehiclePropValuePtr createHwInputKeyProp(VehicleHwKeyInputAction action, int32_t keyCode,
int32_t targetDisplay);
// data members
protected:
EmulatedUserHal mEmulatedUserHal;
private:
GeneratorHub mGeneratorHub{
std::bind(&VehicleHalServer::onFakeValueGenerated, this, std::placeholders::_1)};