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(const std::vector<std::string> & v)36 std::string ControlCallCmd::GetResult(const 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 return resultTime + "HitchTimeRate:" + ss.str() + "ms/s \n" + maxFrame;
112 }
SlideList()113 std::string ControlCallCmd::SlideList()
114 {
115 OHOS::SmartPerf::ParseClickResponseTrace pcrt;
116 OHOS::SmartPerf::StartUpDelay sd;
117 OHOS::SmartPerf::ParseSlideFpsTrace slideFpsTrace;
118 std::string cmdResult;
119 OHOS::SmartPerf::ParseRadar radar;
120 OHOS::SmartPerf::StallingRateTrace srt;
121 std::string resultStream = "";
122 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "fps" + ".ftrace";
123 SPUtils::LoadCmd(rmTrace, cmdResult);
124 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "fps" + ".ftrace";
125 if (isOhTest) {
126 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
127 thGetTrace.join();
128 time = pcrt.ParseResponseTrace(traceName);
129 } else {
130 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
131 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
132 std::promise<std::string> promResponse;
133 std::promise<std::string> promRadarFrame;
134 std::promise<std::string> promResponseMoved = std::move(promResponse);
135 std::promise<std::string> promRadarFrameMoved = std::move(promRadarFrame);
136 std::future<std::string> futureResponse = promResponseMoved.get_future();
137 std::thread([promiseResponse = std::move(promResponseMoved)]() mutable {
138 promiseResponse.set_value(SPUtils::GetRadarResponse());
139 }).detach();
140 std::future<std::string> futureRadarFrame = promRadarFrameMoved.get_future();
141 std::thread([promiseRadarFrame = std::move(promRadarFrameMoved)]() mutable {
142 promiseRadarFrame.set_value(SPUtils::GetRadarFrame());
143 }).detach();
144 std::string responseStr = futureResponse.get();
145 std::string radarFrameStr = futureRadarFrame.get();
146 thGetTrace.join();
147 thGetHisysId.join();
148 double responseTime = radar.ParseRadarResponse(responseStr);
149 stream << responseTime;
150 std::string maxFrame = radar.ParseRadarMaxFrame(radarFrameStr);
151 std::string responseSlide = "ResponseTime:" + stream.str() + "ms\n";
152 double sFps = slideFpsTrace.ParseSlideFpsTraceNoh(traceName);
153 std::ostringstream streamFps;
154 streamFps << sFps;
155 double stallingRateResult = srt.StallingRateResult(traceName);
156 std::ostringstream ss;
157 ss << std::fixed << std::setprecision(two) << stallingRateResult;
158 std::string ssResult = ss.str();
159 std::string hitchTimeRate = "HitchTimeRate:" + ssResult + "ms/s \n";
160 resultStream = "FPS:" + streamFps.str() + "fps\n" + responseSlide + hitchTimeRate + maxFrame;
161 }
162 return resultStream;
163 }
GetFrame()164 std::string ControlCallCmd::GetFrame()
165 {
166 OHOS::SmartPerf::StartUpDelay sd;
167 std::string cmdResult;
168 OHOS::SmartPerf::ParseRadar radar;
169 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "frame" + ".ftrace";
170 SPUtils::LoadCmd(rmTrace, cmdResult);
171 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "frame" + ".ftrace";
172 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
173 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
174 std::string str = SPUtils::GetRadarFrame();
175 thGetTrace.join();
176 thGetHisysId.join();
177 std::string reslut = radar.ParseRadarFrame(str);
178 return result;
179 }
ResponseTime()180 double ControlCallCmd::ResponseTime()
181 {
182 OHOS::SmartPerf::ParseClickResponseTrace pcrt;
183 OHOS::SmartPerf::StartUpDelay sd;
184 std::string cmdResult;
185 OHOS::SmartPerf::ParseRadar radar;
186 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + "*" + ".ftrace";
187 SPUtils::LoadCmd(rmTrace, cmdResult);
188 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "response" + ".ftrace";
189 if (isOhTest) {
190 std::thread([&sd, traceName]() { sd.GetTrace(traceName); }).join();
191 time = pcrt.ParseResponseTrace(traceName);
192 } else {
193 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
194 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysId(); });
195 std::string str = SPUtils::GetRadarResponse();
196 thGetTrace.join();
197 thGetHisysId.join();
198 time = radar.ParseRadarResponse(str);
199 }
200 LOGD("ResponseTime = %d", time);
201 return time;
202 }
CompleteTime()203 double ControlCallCmd::CompleteTime()
204 {
205 OHOS::SmartPerf::StartUpDelay sd;
206 OHOS::SmartPerf::ParseClickCompleteTrace pcct;
207 std::string cmdResult;
208 OHOS::SmartPerf::ParseRadar radar;
209 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + "*" + ".ftrace";
210 SPUtils::LoadCmd(rmTrace, cmdResult);
211 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "complete" + ".ftrace";
212 if (isOhTest) {
213 std::thread([&sd, traceName]() { sd.GetTrace(traceName); }).join();
214 time = pcct.ParseCompleteTrace(traceName);
215 } else {
216 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
217 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysId(); });
218 std::string str = SPUtils::GetRadarComplete();
219 thGetTrace.join();
220 thGetHisysId.join();
221 time = radar.ParseRadarComplete(str);
222 }
223 LOGD("CompleteTime = %d", time);
224 return time;
225 }
GetAppStartTime() const226 std::string ControlCallCmd::GetAppStartTime() const
227 {
228 OHOS::SmartPerf::StartUpDelay sd;
229 std::string cmdResult;
230 OHOS::SmartPerf::ParseRadar radar;
231 OHOS::SmartPerf::StallingRateTrace srt;
232 std::string rmTrace = CMD_COMMAND_MAP.at(CmdCommand::RM_FILE) + std::string("sp_trace_") + "start" + ".ftrace";
233 SPUtils::LoadCmd(rmTrace, cmdResult);
234 std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "start" + ".ftrace";
235 std::thread thGetTrace = std::thread([&sd, traceName]() { sd.GetTrace(traceName); });
236 std::thread thGetHisysId = std::thread([&sd]() { sd.GetHisysIdAndKill(); });
237
238 std::promise<std::string> promRadar;
239 std::promise<std::string> promRadarFrame;
240 std::promise<std::string> promRadarMoved = std::move(promRadar);
241 std::promise<std::string> promRadarFrameMoved = std::move(promRadarFrame);
242 std::future<std::string> futureRadar = promRadarMoved.get_future();
243 std::thread([promiseRadar = std::move(promRadarMoved)]() mutable {
244 promiseRadar.set_value(SPUtils::GetRadar());
245 }).detach();
246 std::future<std::string> futureRadarFrame = promRadarFrameMoved.get_future();
247 std::thread([promiseRadarFrame = std::move(promRadarFrameMoved)]() mutable {
248 promiseRadarFrame.set_value(SPUtils::GetRadarFrame());
249 }).detach();
250 std::string radarStr = futureRadar.get();
251 std::string radarFrameStr = futureRadarFrame.get();
252 thGetTrace.join();
253 thGetHisysId.join();
254 std::string resultStream = radar.ParseRadarAppStrart(radarStr);
255 std::string resultStream2 = radar.ParseRadarMaxFrame(radarFrameStr);
256 double stallingRateResult2 = srt.StallingRateResult(traceName);
257 std::ostringstream ss;
258 ss << std::fixed << std::setprecision(two) << stallingRateResult2;
259 std::string ssResult = ss.str();
260 std::string hitchTimeRate = "HitchTimeRate:" + ssResult + "ms/s \n";
261 resultStream = resultStream + hitchTimeRate + resultStream2;
262 return resultStream;
263 }
IsohTest(const std::vector<std::string> & v)264 void ControlCallCmd::IsohTest(const std::vector<std::string>& v)
265 {
266 if (v[ohType] == "ohtest") {
267 isOhTest = true;
268 }
269 }
270 }
271 }
272