1 /*
2 * Copyright (C) 2021 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 "unistd.h"
16 #include <thread>
17 #include <cstdio>
18 #include <cstring>
19 #include <map>
20 #include <sstream>
21 #include <iomanip>
22 #include <future>
23 #include "include/control_call_cmd.h"
24 #include "include/startup_delay.h"
25 #include "include/sp_utils.h"
26 #include "include/parse_click_complete_trace.h"
27 #include "include/parse_click_response_trace.h"
28 #include "include/parse_radar.h"
29 #include "include/parse_slide_fps_trace.h"
30 #include "include/sp_log.h"
31 #include "include/stalling_rate_trace.h"
32 #include "common.h"
33
34 namespace OHOS {
35 namespace SmartPerf {
GetResult(std::vector<std::string> v)36 std::string ControlCallCmd::GetResult(std::vector<std::string> v)
37 {
38 IsohTest(v);
39 if (v[typeName] == "responseTime") {
40 time = SmartPerf::ControlCallCmd::ResponseTime();
41 } else if (v[typeName] == "completeTime") {
42 time = SmartPerf::ControlCallCmd::CompleteTime();
43 } else if (v[typeName] == "fpsohtest") {
44 std::string ohTestFps = CMD_COMMAND_MAP.at(CmdCommand::OHTESTFPS);
45 SPUtils::LoadCmd(ohTestFps, result);
46 } else if (v[typeName] == "frameLoss") {
47 result = SmartPerf::ControlCallCmd::GetFrame();
48 } else if (v[typeName] == "appStartTime") {
49 result = ControlCallCmd::GetAppStartTime();
50 } else if (v[typeName] == "slideList") {
51 result = ControlCallCmd::SlideList();
52 } else if (v[typeName] == "timeDelay") {
53 result = ControlCallCmd::TimeDelay();
54 }
55 if (time == noNameType) {
56 std::cout << "Startup error, unknown application or application not responding" << std::endl;
57 } else {
58 if (time != 0) {
59 stream << time;
60 result = "time:" + stream.str() + "ms";
61 }
62 std::cout << result << std::endl;
63 }
64 return result;
65 }
TimeDelay()66 std::string ControlCallCmd::TimeDelay()
67 {
68 OHOS::SmartPerf::ParseClickResponseTrace pcrt;
69 OHOS::SmartPerf::StartUpDelay sd;
70 std::string cmdResult;
71 OHOS::SmartPerf::ParseRadar radar;
72 OHOS::SmartPerf::StallingRateTrace srt;
73 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "delay" + ".ftrace";
74 SPUtils::LoadCmd(rmTrace, cmdResult);
75 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "delay" + ".ftrace";
76 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
77 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
78 std::promise<std::string> promResponse;
79 std::promise<std::string> promComplete;
80 std::promise<std::string> promRadarFrame;
81 std::promise<std::string> promResponseMoved = std::move(promResponse);
82 std::promise<std::string> promCompleteMoved = std::move(promComplete);
83 std::promise<std::string> promRadarFrameMoved = std::move(promRadarFrame);
84 std::future<std::string> futureResponse = promResponseMoved.get_future();
85 std::thread([promiseResponse = std::move(promResponseMoved)]() mutable {
86 promiseResponse.set_value(SPUtils::GetRadarResponse());
87 }).detach();
88 std::future<std::string> futureComplete = promCompleteMoved.get_future();
89 std::thread([promiseComplete = std::move(promCompleteMoved)]() mutable {
90 promiseComplete.set_value(SPUtils::GetRadarComplete());
91 }).detach();
92 std::future<std::string> futureRadarFrame = promRadarFrameMoved.get_future();
93 std::thread([promiseRadarFrame = std::move(promRadarFrameMoved)]() mutable {
94 promiseRadarFrame.set_value(SPUtils::GetRadarFrame());
95 }).detach();
96 std::string responseStr = futureResponse.get();
97 std::string completeStr = futureComplete.get();
98 std::string radarFrameStr = futureRadarFrame.get();
99 thGetTrace.join();
100 thGetHisysId.join();
101 double strResponseTime = radar.ParseRadarResponse(responseStr);
102 stream << strResponseTime;
103 double strCompleteTime = radar.ParseRadarComplete(completeStr);
104 std::ostringstream streamComplete;
105 streamComplete << strCompleteTime;
106 std::string maxFrame = radar.ParseRadarMaxFrame(radarFrameStr);
107 std::string resultTime = "ResponseTime:" + stream.str() + "ms\n" + "CompleteTime:" + streamComplete.str() + "ms\n";
108 double rateResult = srt.StallingRateResult(traceName);
109 std::ostringstream ss;
110 ss << std::fixed << std::setprecision(two) << rateResult;
111 std::string ssResult = ss.str();
112 std::string hitchTimeRate = "HitchTimeRate:" + ssResult + "ms/s \n";
113 resultTime = resultTime + hitchTimeRate + maxFrame;
114 return resultTime;
115 }
SlideList()116 std::string ControlCallCmd::SlideList()
117 {
118 OHOS::SmartPerf::ParseClickResponseTrace pcrt;
119 OHOS::SmartPerf::StartUpDelay sd;
120 OHOS::SmartPerf::ParseSlideFpsTrace slideFpsTrace;
121 std::string cmdResult;
122 OHOS::SmartPerf::ParseRadar radar;
123 OHOS::SmartPerf::StallingRateTrace srt;
124 std::string resultStream = "";
125 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "fps" + ".ftrace";
126 SPUtils::LoadCmd(rmTrace, cmdResult);
127 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "fps" + ".ftrace";
128 if (isOhTest) {
129 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
130 thGetTrace.join();
131 time = pcrt.ParseResponseTrace(traceName);
132 } else {
133 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
134 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
135 std::promise<std::string> promResponse;
136 std::promise<std::string> promRadarFrame;
137 std::promise<std::string> promResponseMoved = std::move(promResponse);
138 std::promise<std::string> promRadarFrameMoved = std::move(promRadarFrame);
139 std::future<std::string> futureResponse = promResponseMoved.get_future();
140 std::thread([promiseResponse = std::move(promResponseMoved)]() mutable {
141 promiseResponse.set_value(SPUtils::GetRadarResponse());
142 }).detach();
143 std::future<std::string> futureRadarFrame = promRadarFrameMoved.get_future();
144 std::thread([promiseRadarFrame = std::move(promRadarFrameMoved)]() mutable {
145 promiseRadarFrame.set_value(SPUtils::GetRadarFrame());
146 }).detach();
147 std::string responseStr = futureResponse.get();
148 std::string radarFrameStr = futureRadarFrame.get();
149 thGetTrace.join();
150 thGetHisysId.join();
151 double responseTime = radar.ParseRadarResponse(responseStr);
152 stream << responseTime;
153 std::string maxFrame = radar.ParseRadarMaxFrame(radarFrameStr);
154 std::string responseSlide = "ResponseTime:" + stream.str() + "ms\n";
155 double sFps = slideFpsTrace.ParseSlideFpsTraceNoh(traceName);
156 std::ostringstream streamFps;
157 streamFps << sFps;
158 double stallingRateResult = srt.StallingRateResult(traceName);
159 std::ostringstream ss;
160 ss << std::fixed << std::setprecision(two) << stallingRateResult;
161 std::string ssResult = ss.str();
162 std::string hitchTimeRate = "HitchTimeRate:" + ssResult + "ms/s \n";
163 resultStream = "FPS:" + streamFps.str() + "fps\n" + responseSlide + hitchTimeRate + maxFrame;
164 }
165 return resultStream;
166 }
GetFrame()167 std::string ControlCallCmd::GetFrame()
168 {
169 OHOS::SmartPerf::StartUpDelay sd;
170 std::string cmdResult;
171 OHOS::SmartPerf::ParseRadar radar;
172 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "frame" + ".ftrace";
173 SPUtils::LoadCmd(rmTrace, cmdResult);
174 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "frame" + ".ftrace";
175 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
176 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
177 std::string str = SPUtils::GetRadarFrame();
178 thGetTrace.join();
179 thGetHisysId.join();
180 std::string reslut = radar.ParseRadarFrame(str);
181 return result;
182 }
ResponseTime()183 double ControlCallCmd::ResponseTime()
184 {
185 OHOS::SmartPerf::ParseClickResponseTrace pcrt;
186 OHOS::SmartPerf::StartUpDelay sd;
187 std::string cmdResult;
188 OHOS::SmartPerf::ParseRadar radar;
189 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + "*" + ".ftrace";
190 SPUtils::LoadCmd(rmTrace, cmdResult);
191 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "response" + ".ftrace";
192 if (isOhTest) {
193 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
194 thGetTrace.join();
195 time = pcrt.ParseResponseTrace(traceName);
196 } else {
197 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
198 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysId(); });
199 std::string str = SPUtils::GetRadarResponse();
200 thGetTrace.join();
201 thGetHisysId.join();
202 time = radar.ParseRadarResponse(str);
203 }
204 return time;
205 }
CompleteTime()206 double ControlCallCmd::CompleteTime()
207 {
208 OHOS::SmartPerf::StartUpDelay sd;
209 OHOS::SmartPerf::ParseClickCompleteTrace pcct;
210 std::string cmdResult;
211 OHOS::SmartPerf::ParseRadar radar;
212 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + "*" + ".ftrace";
213 SPUtils::LoadCmd(rmTrace, cmdResult);
214 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "complete" + ".ftrace";
215 if (isOhTest) {
216 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
217 thGetTrace.join();
218 time = pcct.ParseCompleteTrace(traceName);
219 } else {
220 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
221 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysId(); });
222 std::string str = SPUtils::GetRadarComplete();
223 thGetTrace.join();
224 thGetHisysId.join();
225 time = radar.ParseRadarComplete(str);
226 }
227 return time;
228 }
GetAppStartTime() const229 std::string ControlCallCmd::GetAppStartTime() const
230 {
231 OHOS::SmartPerf::StartUpDelay sd;
232 std::string cmdResult;
233 OHOS::SmartPerf::ParseRadar radar;
234 OHOS::SmartPerf::StallingRateTrace srt;
235 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "start" + ".ftrace";
236 SPUtils::LoadCmd(rmTrace, cmdResult);
237 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "start" + ".ftrace";
238 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
239 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
240
241 std::promise<std::string> promRadar;
242 std::promise<std::string> promRadarFrame;
243 std::promise<std::string> promRadarMoved = std::move(promRadar);
244 std::promise<std::string> promRadarFrameMoved = std::move(promRadarFrame);
245 std::future<std::string> futureRadar = promRadarMoved.get_future();
246 std::thread([promiseRadar = std::move(promRadarMoved)]() mutable {
247 promiseRadar.set_value(SPUtils::GetRadar());
248 }).detach();
249 std::future<std::string> futureRadarFrame = promRadarFrameMoved.get_future();
250 std::thread([promiseRadarFrame = std::move(promRadarFrameMoved)]() mutable {
251 promiseRadarFrame.set_value(SPUtils::GetRadarFrame());
252 }).detach();
253 std::string radarStr = futureRadar.get();
254 std::string radarFrameStr = futureRadarFrame.get();
255 thGetTrace.join();
256 thGetHisysId.join();
257 std::string resultStream = radar.ParseRadarAppStrart(radarStr);
258 std::string resultStream2 = radar.ParseRadarMaxFrame(radarFrameStr);
259 double stallingRateResult2 = srt.StallingRateResult(traceName);
260 std::ostringstream ss;
261 int two = 2;
262 ss << std::fixed << std::setprecision(two) << stallingRateResult2;
263 std::string ssResult = ss.str();
264 std::string hitchTimeRate = "HitchTimeRate:" + ssResult + "ms/s \n";
265 resultStream = resultStream + hitchTimeRate + resultStream2;
266 return resultStream;
267 }
IsohTest(std::vector<std::string> v)268 void ControlCallCmd::IsohTest(std::vector<std::string> v)
269 {
270 if (v[ohType] == "ohtest") {
271 isOhTest = true;
272 }
273 }
274 }
275 }
276