1/* 2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "hdi_test_device.h" 17#include <mutex> 18#include "v1_0/include/idisplay_buffer.h" 19#include "v1_1/display_composer_type.h" 20#include "hdi_test_device_common.h" 21 22namespace OHOS { 23namespace HDI { 24namespace Display { 25namespace TEST { 26using namespace OHOS::HDI::Display::Buffer::V1_0; 27HdiTestDevice& HdiTestDevice::GetInstance() 28{ 29 static HdiTestDevice device; 30 return device; 31} 32 33void HdiTestDevice::HotPlug(uint32_t outputId, bool connected, void* data) 34{ 35 DISPLAY_TEST_LOGE("outputId %{public}u connected %{public}d", outputId, connected); 36 DISPLAY_TEST_CHK_RETURN_NOT_VALUE((data == nullptr), DISPLAY_TEST_LOGE("the data is null ptr")); 37 HdiTestDevice* device = static_cast<HdiTestDevice *>(data); 38 if (connected) { 39 device->FindDisplayOrCreate(outputId); 40 } 41 DISPLAY_TEST_LOGE("end"); 42} 43 44int32_t HdiTestDevice::InitDevice() 45{ 46 displayDevice_ = Composer::V1_2::IDisplayComposerInterface::Get(); 47 DISPLAY_TEST_CHK_RETURN((displayDevice_ == nullptr), DISPLAY_FAILURE, 48 DISPLAY_TEST_LOGE("get IDisplayComposerInterface failed")); 49 50 gralloc_.reset(IDisplayBuffer::Get()); 51 DISPLAY_TEST_CHK_RETURN((gralloc_ == nullptr), DISPLAY_FAILURE, DISPLAY_TEST_LOGE("get IDisplayBuffer failed")); 52 53 displayDevice_->RegHotPlugCallback(HotPlug, static_cast<void *>(this)); 54 55 return DISPLAY_SUCCESS; 56} 57 58std::shared_ptr<HdiTestDisplay> HdiTestDevice::GetDisplayFromId(uint32_t id) 59{ 60 auto iter = displays_.find(id); 61 DISPLAY_TEST_CHK_RETURN((iter == displays_.end()), nullptr, DISPLAY_TEST_LOGE("can not find the display %{public}u", 62 id)); 63 return displays_[id]; 64} 65 66std::shared_ptr<HdiTestDisplay> HdiTestDevice::FindDisplayOrCreate(uint32_t id) 67{ 68 int ret; 69 std::shared_ptr<HdiTestDisplay> display = GetDisplayFromId(id); 70 if (display == nullptr) { 71 DISPLAY_TEST_LOGE("the display not find will creat a display"); 72 } 73 display = std::make_shared<HdiTestDisplay>(id, displayDevice_); 74 ret = display->Init(); 75 DISPLAY_TEST_CHK_RETURN((ret != DISPLAY_SUCCESS), nullptr, DISPLAY_TEST_LOGE("can not init the display")); 76 displays_.emplace(id, display); 77 displayIds_.push_back(id); 78 return display; 79} 80 81std::shared_ptr<HdiTestDisplay> HdiTestDevice::GetFirstDisplay() 82{ 83 DISPLAY_TEST_CHK_RETURN((displays_.begin() == displays_.end()), nullptr, 84 DISPLAY_TEST_LOGE("the displays_ is empty")); 85 return displays_.begin()->second; 86} 87 88void HdiTestDevice::Clear() const 89{ 90 for (auto const & iter : displays_) { 91 iter.second->Clear(); 92 } 93} 94 95std::vector<uint32_t> HdiTestDevice::GetDevIds() const 96{ 97 return displayIds_; 98} 99} // OHOS 100} // HDI 101} // Display 102} // TEST 103