1 /*
2  * Copyright (c) 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 
16 #include "frame_msg_mgr.h"
17 #include <map>
18 #include <new>
19 #include <utility>
20 #include "rme_log_domain.h"
21 
22 #undef LOG_TAG
23 #define LOG_TAG "ueaClient-FrameMsgMgr"
24 
25 namespace OHOS {
26 namespace RME {
27 IMPLEMENT_SINGLE_INSTANCE(FrameMsgMgr);
28 
FrameMsgMgr()29 FrameMsgMgr::FrameMsgMgr()
30     : sceneType(SceneEvent::SLIDE), rmeScene(nullptr)
31 {
32     FrameMapKeyToFunc();
33 }
34 
~FrameMsgMgr()35 FrameMsgMgr::~FrameMsgMgr()
36 {
37     if (rmeScene != nullptr) {
38         delete rmeScene;
39         rmeScene = nullptr;
40     }
41 }
42 
Init()43 bool FrameMsgMgr::Init()
44 {
45     if (rmeScene == nullptr) {
46         rmeScene = new RmeSceneSched();
47     }
48     if (!rmeScene->Init()) {
49         RME_LOGE("[Init]:inited failed!");
50         return false;
51     }
52     RME_LOGI("[Init]:inited success!");
53     return true;
54 }
55 
EventUpdate(FrameEvent event)56 void FrameMsgMgr::EventUpdate(FrameEvent event)
57 {
58     switch (event) {
59         case FrameEvent::EVENT_SET_PARAM:
60             SetSchedParam();
61             break;
62         default:
63             HandleFrameMsgKey(event);
64             break;
65     }
66 }
67 
HandleFrameMsgKey(FrameEvent event)68 bool FrameMsgMgr::HandleFrameMsgKey(FrameEvent event)
69 {
70     std::map<FrameEvent, PHandle>::iterator iter = m_frameMsgKeyToFunc.find(event);
71     if (m_frameMsgKeyToFunc.end() == iter) {
72         RME_LOGE("[HandleFrameMsgKey]: search frameEvent:%{public}d failed!",
73             static_cast<int>(event));
74         return false;
75     }
76     PHandle pFunction = iter->second;
77     (this->*pFunction)();
78     return true;
79 }
80 
FrameMapKeyToFunc()81 void FrameMsgMgr::FrameMapKeyToFunc()
82 {
83     m_frameMsgKeyToFunc[FrameEvent::EVENT_BEGIN_FRAME] = &FrameMsgMgr::HandleBeginScene;
84     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_ANIMATION_START] = &FrameMsgMgr::BeginFlushAnimation;
85     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_ANIMATION_END] = &FrameMsgMgr::EndFlushAnimation;
86     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_BUILD_START] = &FrameMsgMgr::BeginFlushBuild;
87     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_BUILD_END] = &FrameMsgMgr::EndFlushBuild;
88     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_LAYOUT_START] = &FrameMsgMgr::BeginFlushLayout;
89     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_LAYOUT_END] = &FrameMsgMgr::EndFlushLayout;
90     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_RENDER_START] = &FrameMsgMgr::BeginFlushRender;
91     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_RENDER_END] = &FrameMsgMgr::EndFlushRender;
92     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_RENDER_FINISH_START] = &FrameMsgMgr::BeginFlushRenderFinish;
93     m_frameMsgKeyToFunc[FrameEvent::EVENT_FLUSH_RENDER_FINISH_END] = &FrameMsgMgr::EndFlushRenderFinish;
94     m_frameMsgKeyToFunc[FrameEvent::EVENT_PROCESS_POST_FLUSH_START] = &FrameMsgMgr::BeginProcessPostFlush;
95     m_frameMsgKeyToFunc[FrameEvent::EVENT_PROCESS_COMMANDS_START] = &FrameMsgMgr::ProcessCommandsStart;
96     m_frameMsgKeyToFunc[FrameEvent::EVENT_ANIMATE_START] = &FrameMsgMgr::AnimateStart;
97     m_frameMsgKeyToFunc[FrameEvent::EVENT_RENDER_START] = &FrameMsgMgr::RenderStart;
98     m_frameMsgKeyToFunc[FrameEvent::EVENT_SEND_COMMANDS_START] = &FrameMsgMgr::SendCommandsStart;
99     m_frameMsgKeyToFunc[FrameEvent::EVENT_END_FRAME] = &FrameMsgMgr::HandleEndScene;
100 }
101 
GetSceneHandler() const102 FrameSceneSched *FrameMsgMgr::GetSceneHandler() const
103 {
104     if (sceneType == SceneEvent::SCENE_INVALID) {
105         RME_LOGE("[GetSceneHandler]:get nullptr sceneType %{public}d,", static_cast<int>(sceneType));
106         return nullptr;
107     }
108     return rmeScene;
109 }
110 
UpdateScene(SceneEvent scene)111 void FrameMsgMgr::UpdateScene(SceneEvent scene)
112 {
113     if (scene < SceneEvent::SCENE_INVALID || scene >= SceneEvent::SCENE_MAX) {
114         scene = SceneEvent::SCENE_INVALID;
115     }
116     sceneType = scene;
117 }
118 
HandleBeginScene()119 void FrameMsgMgr::HandleBeginScene()
120 {
121     FrameSceneSched *scene = GetSceneHandler();
122     if (scene == nullptr) {
123         RME_LOGE("[HandleBeginScene]:scene nullptr");
124         return;
125     }
126     scene->HandleBeginScene();
127 }
128 
BeginFlushAnimation()129 void FrameMsgMgr::BeginFlushAnimation()
130 {
131     FrameSceneSched *scene = GetSceneHandler();
132     if (scene == nullptr) {
133         RME_LOGE("[BeginFlushAnimation]:scene nullptr");
134         return;
135     }
136     scene->BeginFlushAnimation();
137 }
138 
EndFlushAnimation()139 void FrameMsgMgr::EndFlushAnimation()
140 {
141     FrameSceneSched *scene = GetSceneHandler();
142     if (scene == nullptr) {
143         RME_LOGE("[EndFlushAnimation]:scene nullptr");
144         return;
145     }
146     scene->EndFlushAnimation();
147 }
148 
BeginFlushBuild()149 void FrameMsgMgr::BeginFlushBuild()
150 {
151     FrameSceneSched *scene = GetSceneHandler();
152     if (scene == nullptr) {
153         RME_LOGE("[BeginFlushBuild]:scene nullptr");
154         return;
155     }
156     scene->BeginFlushBuild();
157 }
158 
EndFlushBuild()159 void FrameMsgMgr::EndFlushBuild()
160 {
161     FrameSceneSched *scene = GetSceneHandler();
162     if (scene == nullptr) {
163         RME_LOGE("[EndFlushBuild]:scene nullptr");
164         return;
165     }
166     scene->EndFlushBuild();
167 }
168 
BeginFlushLayout()169 void FrameMsgMgr::BeginFlushLayout()
170 {
171     FrameSceneSched *scene = GetSceneHandler();
172     if (scene == nullptr) {
173         RME_LOGE("[BeginFlushLayout]:scene nullptr");
174         return;
175     }
176     scene->BeginFlushLayout();
177 }
178 
EndFlushLayout()179 void FrameMsgMgr::EndFlushLayout()
180 {
181     FrameSceneSched *scene = GetSceneHandler();
182     if (scene == nullptr) {
183         RME_LOGE("[EndFlushLayout]:scene nullptr");
184         return;
185     }
186     scene->EndFlushLayout();
187 }
188 
BeginFlushRender()189 void FrameMsgMgr::BeginFlushRender()
190 {
191     FrameSceneSched *scene = GetSceneHandler();
192     if (scene == nullptr) {
193         RME_LOGE("[BeginFlushRender]:scene nullptr");
194         return;
195     }
196     scene->BeginFlushRender();
197 }
198 
EndFlushRender()199 void FrameMsgMgr::EndFlushRender()
200 {
201     FrameSceneSched *scene = GetSceneHandler();
202     if (scene == nullptr) {
203         RME_LOGE("[EndFlushRender]:scene nullptr");
204         return;
205     }
206     scene->EndFlushRender();
207 }
208 
BeginFlushRenderFinish()209 void FrameMsgMgr::BeginFlushRenderFinish()
210 {
211     FrameSceneSched *scene = GetSceneHandler();
212     if (scene == nullptr) {
213         RME_LOGE("[BeginFlushRenderFinish]:scene nullptr");
214         return;
215     }
216     scene->BeginFlushRenderFinish();
217 }
218 
EndFlushRenderFinish()219 void FrameMsgMgr::EndFlushRenderFinish()
220 {
221     FrameSceneSched *scene = GetSceneHandler();
222     if (scene == nullptr) {
223         RME_LOGE("[EndFlushRenderFinish]:scene nullptr");
224         return;
225     }
226     scene->EndFlushRenderFinish();
227 }
228 
BeginProcessPostFlush()229 void FrameMsgMgr::BeginProcessPostFlush()
230 {
231     FrameSceneSched *scene = GetSceneHandler();
232     if (scene == nullptr) {
233         RME_LOGE("[BeginProcessPostFlush]:scene nullptr");
234         return;
235     }
236     scene->BeginProcessPostFlush();
237 }
238 
ProcessCommandsStart()239 void FrameMsgMgr::ProcessCommandsStart()
240 {
241     FrameSceneSched *scene = GetSceneHandler();
242     if (scene == nullptr) {
243         RME_LOGE("[ProcessCommandsStart]:scene nullptr");
244         return;
245     }
246     scene->ProcessCommandsStart();
247 }
248 
AnimateStart()249 void FrameMsgMgr::AnimateStart()
250 {
251     FrameSceneSched *scene = GetSceneHandler();
252     if (scene == nullptr) {
253         RME_LOGE("[AnimateStart]:scene nullptr");
254         return;
255     }
256     scene->AnimateStart();
257 }
258 
RenderStart()259 void FrameMsgMgr::RenderStart()
260 {
261     FrameSceneSched *scene = GetSceneHandler();
262     if (scene == nullptr) {
263         RME_LOGE("[RenderStart]:scene nullptr");
264         return;
265     }
266     scene->RenderStart();
267 }
268 
SendCommandsStart()269 void FrameMsgMgr::SendCommandsStart()
270 {
271     FrameSceneSched *scene = GetSceneHandler();
272     if (scene == nullptr) {
273         RME_LOGE("[SendCommandsStart]:scene nullptr");
274         return;
275     }
276     scene->SendCommandsStart();
277 }
278 
HandleEndScene()279 void FrameMsgMgr::HandleEndScene()
280 {
281     FrameSceneSched *scene = GetSceneHandler();
282     if (scene == nullptr) {
283         RME_LOGE("[HandleEndScene]:scene nullptr");
284         return;
285     }
286     scene->HandleEndScene();
287 }
288 
SetSchedParam()289 void FrameMsgMgr::SetSchedParam()
290 {
291     RME_LOGI("[SetSchedParam]: set default sched param!");
292 }
293 } // namespace RME
294 } // namespace OHOS
295