blob: fa39a57e21114a81309c9e1cdc70c6fc3330c495 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_
#define android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_
#include <log/log.h>
#include <memory>
#include <thread>
#include <vector>
#include <vhal_v2_0/VehicleHal.h>
#include <vhal_v2_0/VehicleServer.h>
#include "CommConn.h"
#include "PipeComm.h"
#include "SocketComm.h"
#include "VehicleHalProto.pb.h"
namespace android {
namespace hardware {
namespace automotive {
namespace vehicle {
namespace V2_0 {
namespace impl {
class VehicleEmulator; // Forward declaration.
/** An interface used by VehicleEmulator. */
class EmulatedServerIface {
public:
using VehiclePropValuePtr = VehicleHal::VehiclePropValuePtr;
virtual ~EmulatedServerIface() = default;
virtual bool setPropertyFromVehicle(const VehiclePropValue& propValue) = 0;
virtual std::vector<VehiclePropValue> getAllProperties() const = 0;
virtual std::vector<VehiclePropConfig> listProperties() = 0;
virtual VehiclePropValuePtr get(const VehiclePropValue& requestedPropValue,
StatusCode* outStatus) = 0;
virtual IVehicleServer::DumpResult debug(const std::vector<std::string>& options) = 0;
void registerEmulator(VehicleEmulator* emulator) {
ALOGI("%s, emulator: %p", __func__, emulator);
std::lock_guard<std::mutex> g(mEmulatorLock);
mEmulator = emulator;
}
protected:
VehicleEmulator* getEmulatorOrDie() {
std::lock_guard<std::mutex> g(mEmulatorLock);
if (mEmulator == nullptr) abort();
return mEmulator;
}
private:
mutable std::mutex mEmulatorLock;
VehicleEmulator* mEmulator;
};
/**
* Emulates vehicle by providing controlling interface from host side either through ADB or Pipe.
*/
class VehicleEmulator : public MessageProcessor {
public:
VehicleEmulator(EmulatedServerIface* hal);
virtual ~VehicleEmulator();
void doSetValueFromClient(const VehiclePropValue& propValue);
void processMessage(const vhal_proto::EmulatorMessage& rxMsg,
vhal_proto::EmulatorMessage* respMsg) override;
private:
friend class ConnectionThread;
using EmulatorMessage = vhal_proto::EmulatorMessage;
void doGetConfig(const EmulatorMessage& rxMsg, EmulatorMessage* respMsg);
void doGetConfigAll(const EmulatorMessage& rxMsg, EmulatorMessage* respMsg);
void doGetProperty(const EmulatorMessage& rxMsg, EmulatorMessage* respMsg);
void doGetPropertyAll(const EmulatorMessage& rxMsg, EmulatorMessage* respMsg);
void doSetProperty(const EmulatorMessage& rxMsg, EmulatorMessage* respMsg);
void doDebug(const EmulatorMessage& rxMsg, EmulatorMessage* respMsg);
void populateProtoVehicleConfig(vhal_proto::VehiclePropConfig* protoCfg,
const VehiclePropConfig& cfg);
void populateProtoVehiclePropValue(vhal_proto::VehiclePropValue* protoVal,
const VehiclePropValue* val);
private:
EmulatedServerIface* mHal;
std::unique_ptr<SocketComm> mSocketComm;
std::unique_ptr<PipeComm> mPipeComm;
};
// determine if it's running inside Android Emulator
bool isInQEMU();
} // impl
} // namespace V2_0
} // namespace vehicle
} // namespace automotive
} // namespace hardware
} // namespace android
#endif // android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_