blob: 82947beef18a6ecabeefa8423d131291aacbbae1 [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 "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.
/** Extension of VehicleHal that used by VehicleEmulator. */
class EmulatedVehicleHalIface : public VehicleHal {
public:
virtual bool setPropertyFromVehicle(const VehiclePropValue& propValue) = 0;
virtual std::vector<VehiclePropValue> getAllProperties() const = 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(EmulatedVehicleHalIface* hal);
virtual ~VehicleEmulator();
void doSetValueFromClient(const VehiclePropValue& propValue);
void processMessage(vhal_proto::EmulatorMessage const& rxMsg,
vhal_proto::EmulatorMessage& respMsg) override;
private:
friend class ConnectionThread;
using EmulatorMessage = vhal_proto::EmulatorMessage;
void doGetConfig(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg);
void doGetConfigAll(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg);
void doGetProperty(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg);
void doGetPropertyAll(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg);
void doSetProperty(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg);
void populateProtoVehicleConfig(vhal_proto::VehiclePropConfig* protoCfg,
const VehiclePropConfig& cfg);
void populateProtoVehiclePropValue(vhal_proto::VehiclePropValue* protoVal,
const VehiclePropValue* val);
private:
EmulatedVehicleHalIface* mHal;
std::unique_ptr<SocketComm> mSocketComm;
std::unique_ptr<PipeComm> mPipeComm;
};
} // impl
} // namespace V2_0
} // namespace vehicle
} // namespace automotive
} // namespace hardware
} // namespace android
#endif // android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_