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