/* * 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 #include #include #include #include #include #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 getAllProperties() const = 0; virtual std::vector listProperties() = 0; virtual VehiclePropValuePtr get(const VehiclePropValue& requestedPropValue, StatusCode* outStatus) = 0; virtual IVehicleServer::DumpResult debug(const std::vector& options) = 0; void registerEmulator(VehicleEmulator* emulator) { ALOGI("%s, emulator: %p", __func__, emulator); std::lock_guard g(mEmulatorLock); mEmulator = emulator; } protected: VehicleEmulator* getEmulatorOrDie() { std::lock_guard 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 mSocketComm; std::unique_ptr 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_