blob: 07fbec1e19ceeab231e3e45c8673ca3acba71820 [file] [log] [blame]
/*
* Copyright (C) 2022 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 CPP_EVS_MANAGER_AIDL_INCLUDE_ENUMERATOR_H
#define CPP_EVS_MANAGER_AIDL_INCLUDE_ENUMERATOR_H
#include "HalCamera.h"
#include "VirtualCamera.h"
#include "stats/include/StatsCollector.h"
#include <aidl/android/hardware/automotive/evs/BnEvsEnumerator.h>
#include <aidl/android/hardware/automotive/evs/BnEvsEnumeratorStatusCallback.h>
#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
#include <system/camera_metadata.h>
#include <list>
#include <shared_mutex>
#include <unordered_map>
#include <unordered_set>
namespace aidl::android::automotive::evs::implementation {
namespace aidlevs = ::aidl::android::hardware::automotive::evs;
class Enumerator final : public ::aidl::android::hardware::automotive::evs::BnEvsEnumerator {
public:
// Methods from ::aidl::android::hardware::automotive::evs::IEvsEnumerator
::ndk::ScopedAStatus isHardware(bool* flag) override;
::ndk::ScopedAStatus openCamera(const std::string& cameraId,
const aidlevs::Stream& streamConfig,
std::shared_ptr<aidlevs::IEvsCamera>* obj) override;
::ndk::ScopedAStatus closeCamera(const std::shared_ptr<aidlevs::IEvsCamera>& obj) override;
::ndk::ScopedAStatus getCameraList(std::vector<aidlevs::CameraDesc>* _aidl_return) override;
::ndk::ScopedAStatus getStreamList(const aidlevs::CameraDesc& desc,
std::vector<aidlevs::Stream>* _aidl_return) override;
::ndk::ScopedAStatus openDisplay(int32_t displayId,
std::shared_ptr<aidlevs::IEvsDisplay>* obj) override;
::ndk::ScopedAStatus closeDisplay(const std::shared_ptr<aidlevs::IEvsDisplay>& obj) override;
::ndk::ScopedAStatus getDisplayIdList(std::vector<uint8_t>* list) override;
::ndk::ScopedAStatus getDisplayState(aidlevs::DisplayState* state) override;
::ndk::ScopedAStatus registerStatusCallback(
const std::shared_ptr<aidlevs::IEvsEnumeratorStatusCallback>& callback) override;
::ndk::ScopedAStatus openUltrasonicsArray(
const std::string& id, std::shared_ptr<aidlevs::IEvsUltrasonicsArray>* obj) override;
::ndk::ScopedAStatus closeUltrasonicsArray(
const std::shared_ptr<aidlevs::IEvsUltrasonicsArray>& obj) override;
::ndk::ScopedAStatus getUltrasonicsArrayList(
std::vector<aidlevs::UltrasonicsArrayDesc>* list) override;
// Method from ::ndk::ICInterface
binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
// Implementation details
bool init(const std::string_view& hardwareServiceName);
void broadcastDeviceStatusChange(const std::vector<aidlevs::DeviceStatus>& list);
// Destructor
virtual ~Enumerator();
// TODO(b/235110887): We may eventually want to remove below two methods and
// replace their functionality with other methods more
// elegant.
bool init(std::shared_ptr<aidlevs::IEvsEnumerator>& hwEnumerator, bool enableMonitor = false);
void enablePermissionCheck(bool enable);
private:
class EvsDeviceStatusCallbackImpl : public aidlevs::BnEvsEnumeratorStatusCallback {
public:
EvsDeviceStatusCallbackImpl(const std::shared_ptr<Enumerator>& enumerator) :
mEnumerator(enumerator) {}
::ndk::ScopedAStatus deviceStatusChanged(
const std::vector<aidlevs::DeviceStatus>& status) override;
private:
std::shared_ptr<Enumerator> mEnumerator;
};
bool checkPermission() const;
bool isLogicalCamera(const camera_metadata_t* metadata) const;
std::unordered_set<std::string> getPhysicalCameraIds(const std::string& id);
std::shared_ptr<aidlevs::IEvsEnumerator> connectToAidlHal(
const std::string_view& hardwareServiceName, bool blocking);
std::shared_ptr<aidlevs::IEvsEnumerator> connectToHidlHal(
const std::string_view& hardwareServiceName);
void cmdDump(int fd, const char** args, uint32_t numArgs);
void cmdHelp(int fd);
void cmdList(int fd, const char** args, uint32_t numArgs);
void cmdDumpDevice(int fd, const char** args, uint32_t numArgs);
// Hardware enumerator
std::shared_ptr<aidlevs::IEvsEnumerator> mHwEnumerator;
// Display proxy object warpping hw display
std::weak_ptr<aidlevs::IEvsDisplay> mActiveDisplay;
// List of active camera proxy objects that wrap hw cameras
std::unordered_map<std::string, std::shared_ptr<HalCamera>> mActiveCameras;
// List of camera descriptors of enumerated hw cameras
std::unordered_map<std::string, aidlevs::CameraDesc> mCameraDevices;
// List of available physical display devices
std::vector<uint8_t> mDisplayPorts;
// Display port the internal display is connected to.
int32_t mInternalDisplayPort;
// Collecting camera usage statistics from clients
::android::sp<StatsCollector> mClientsMonitor;
// Boolean flag to tell whether the camera usages are being monitored or not
bool mMonitorEnabled;
// Boolean flag to tell whether EvsDisplay is owned exclusively or not
bool mDisplayOwnedExclusively;
// Callback to listen to device status changes
std::shared_ptr<EvsDeviceStatusCallbackImpl> mDeviceStatusCallback;
// Mutex to protect resources related with a device status callback
mutable std::shared_mutex mLock;
// Clients to forward device status callback messages
std::set<std::shared_ptr<aidlevs::IEvsEnumeratorStatusCallback>> mDeviceStatusCallbacks;
bool mDisablePermissionCheck = false;
};
} // namespace aidl::android::automotive::evs::implementation
#endif // CPP_EVS_MANAGER_AIDL_INCLUDE_ENUMERATOR_H