1 /*
2  * Copyright (c) 2021-2022 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 #include "surface_dev.h"
16 #include <unistd.h>
17 #include "drm_driver.h"
18 #include "fbdev_driver.h"
19 #include "log/log.h"
20 #include "updater_ui_const.h"
21 
22 namespace Updater {
23 std::vector<std::string> SurfaceDev::fbDeviceList_ {FB_DEV_PATH};
24 
MakeDevDrv(DevType devType)25 std::unique_ptr<GraphicDrv> SurfaceDev::MakeDevDrv(DevType devType)
26 {
27     std::unique_ptr<GraphicDrv> drv = nullptr;
28     switch (devType) {
29         case DevType::DRM_DEVICE:
30             drv = std::make_unique<DrmDriver>();
31             break;
32         case DevType::FB_DEVICE:
33             drv = std::make_unique<FbdevDriver>();
34             break;
35         default:
36             LOG(ERROR) << " not Support.";
37             break;
38     }
39     return drv;
40 }
41 
Flip(const uint8_t * buf) const42 void SurfaceDev::Flip(const uint8_t *buf) const
43 {
44     if (buf == nullptr) {
45         LOG(ERROR) << "buf is null";
46         return;
47     }
48     if (drv_ != nullptr) {
49         drv_->Flip(buf);
50     }
51 }
52 
GetDevType() const53 DevType SurfaceDev::GetDevType() const
54 {
55     bool isFbDevice = std::find_if(fbDeviceList_.begin(), fbDeviceList_.end(), [] (auto &devicePath) {
56         if (access(devicePath.c_str(), 0) != 0) {
57             LOG(WARNING) << devicePath << " not existed";
58             return false;
59         }
60         return true;
61     }) != fbDeviceList_.end();
62     if (access(DRM_DEV_PATH, 0) == 0) {
63         return DevType::DRM_DEVICE;
64     } else if (isFbDevice) {
65         return DevType::FB_DEVICE;
66     }
67     return DevType::UNKNOW_DEVICE;
68 }
69 
Init()70 bool SurfaceDev::Init()
71 {
72     drv_ = MakeDevDrv(GetDevType());
73     if (drv_ != nullptr) {
74         return drv_->Init();
75     }
76     return false;
77 }
78 
Blank(bool blank)79 void SurfaceDev::Blank(bool blank)
80 {
81     if (drv_ != nullptr) {
82         drv_->Blank(blank);
83     }
84 }
85 
Exit(void)86 void SurfaceDev::Exit(void)
87 {
88     if (drv_ != nullptr) {
89         drv_->Exit();
90     }
91 }
92 
AddFbDevice(const std::string & devicePath)93 void SurfaceDev::AddFbDevice(const std::string &devicePath)
94 {
95     fbDeviceList_.push_back(devicePath);
96 }
97 
GetScreenSize(uint16_t & w,uint16_t & h,GrSurface & surface) const98 void SurfaceDev::GetScreenSize(uint16_t &w, uint16_t &h, GrSurface &surface) const
99 {
100     if (drv_ != nullptr) {
101         drv_->GetGrSurface(surface);
102     }
103     w = surface.width;
104     h = surface.height;
105     LOG(INFO) << "weight=" << w << " " << "height=" << h;
106 }
107 
~SurfaceDev()108 SurfaceDev::~SurfaceDev()
109 {
110     LOG(INFO) << "SurfaceDev end";
111 }
112 } // namespace Updater
113