• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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