/* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * 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. */ #include "surface_dev.h" #include #include "drm_driver.h" #include "fbdev_driver.h" #include "log/log.h" #include "updater_ui_const.h" namespace Updater { std::vector SurfaceDev::fbDeviceList_ {FB_DEV_PATH}; std::unique_ptr SurfaceDev::MakeDevDrv(DevType devType) { std::unique_ptr drv = nullptr; switch (devType) { case DevType::DRM_DEVICE: drv = std::make_unique(); break; case DevType::FB_DEVICE: drv = std::make_unique(); break; default: LOG(ERROR) << " not Support."; break; } return drv; } void SurfaceDev::Flip(const uint8_t *buf) const { if (buf == nullptr) { LOG(ERROR) << "buf is null"; return; } if (drv_ != nullptr) { drv_->Flip(buf); } } DevType SurfaceDev::GetDevType() const { bool isFbDevice = std::find_if(fbDeviceList_.begin(), fbDeviceList_.end(), [] (auto &devicePath) { if (access(devicePath.c_str(), 0) != 0) { LOG(WARNING) << devicePath << " not existed"; return false; } return true; }) != fbDeviceList_.end(); if (access(DRM_DEV_PATH, 0) == 0) { return DevType::DRM_DEVICE; } else if (isFbDevice) { return DevType::FB_DEVICE; } return DevType::UNKNOW_DEVICE; } bool SurfaceDev::Init() { drv_ = MakeDevDrv(GetDevType()); if (drv_ != nullptr) { return drv_->Init(); } return false; } void SurfaceDev::Blank(bool blank) { if (drv_ != nullptr) { drv_->Blank(blank); } } void SurfaceDev::Exit(void) { if (drv_ != nullptr) { drv_->Exit(); } } void SurfaceDev::AddFbDevice(const std::string &devicePath) { fbDeviceList_.push_back(devicePath); } void SurfaceDev::GetScreenSize(uint16_t &w, uint16_t &h, GrSurface &surface) const { if (drv_ != nullptr) { drv_->GetGrSurface(surface); } w = surface.width; h = surface.height; LOG(INFO) << "weight=" << w << " " << "height=" << h; } SurfaceDev::~SurfaceDev() { LOG(INFO) << "SurfaceDev end"; } } // namespace Updater