106f6ba60Sopenharmony_ci/* 206f6ba60Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License. 506f6ba60Sopenharmony_ci * You may obtain a copy of the License at 606f6ba60Sopenharmony_ci * 706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 806f6ba60Sopenharmony_ci * 906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and 1306f6ba60Sopenharmony_ci * limitations under the License. 1406f6ba60Sopenharmony_ci */ 1506f6ba60Sopenharmony_ci#include <cstdio> 1606f6ba60Sopenharmony_ci#include <thread> 1706f6ba60Sopenharmony_ci#include <cstring> 1806f6ba60Sopenharmony_ci#include "unistd.h" 1906f6ba60Sopenharmony_ci#include <fstream> 2006f6ba60Sopenharmony_ci#include <sstream> 2106f6ba60Sopenharmony_ci#include "include/smartperf_command.h" 2206f6ba60Sopenharmony_ci#include "include/editor_command.h" 2306f6ba60Sopenharmony_ci#include "include/profiler_fps.h" 2406f6ba60Sopenharmony_ci#include "include/client_control.h" 2506f6ba60Sopenharmony_ci#include "include/sp_utils.h" 2606f6ba60Sopenharmony_ci#include "include/sp_log.h" 2706f6ba60Sopenharmony_ci#include "include/common.h" 2806f6ba60Sopenharmony_ci#include "parameters.h" 2906f6ba60Sopenharmony_ci 3006f6ba60Sopenharmony_cistatic std::string GetOptions(const std::vector<std::string> &argv) 3106f6ba60Sopenharmony_ci{ 3206f6ba60Sopenharmony_ci std::string str = ""; 3306f6ba60Sopenharmony_ci std::string strFlag; 3406f6ba60Sopenharmony_ci bool isFill = false; 3506f6ba60Sopenharmony_ci for (std::size_t i = 0; i < argv.size(); i++) { 3606f6ba60Sopenharmony_ci if (!isFill) { 3706f6ba60Sopenharmony_ci strFlag = argv[i]; 3806f6ba60Sopenharmony_ci if (strFlag.find("SP_daemon") != std::string::npos) { 3906f6ba60Sopenharmony_ci isFill = true; 4006f6ba60Sopenharmony_ci } 4106f6ba60Sopenharmony_ci } else { 4206f6ba60Sopenharmony_ci str += argv[i]; 4306f6ba60Sopenharmony_ci if (i + 1 != argv.size()) { 4406f6ba60Sopenharmony_ci str += " "; 4506f6ba60Sopenharmony_ci } 4606f6ba60Sopenharmony_ci } 4706f6ba60Sopenharmony_ci } 4806f6ba60Sopenharmony_ci return str; 4906f6ba60Sopenharmony_ci} 5006f6ba60Sopenharmony_ci 5106f6ba60Sopenharmony_cistatic bool g_checkCmdParam(std::vector<std::string> &argv, std::string &errorInfo) 5206f6ba60Sopenharmony_ci{ 5306f6ba60Sopenharmony_ci std::string str = GetOptions(argv); 5406f6ba60Sopenharmony_ci std::set<std::string> keys; // Includes three parts "SP_daemon" CommandType and CommandHelp 5506f6ba60Sopenharmony_ci if (str.empty()) { 5606f6ba60Sopenharmony_ci return true; 5706f6ba60Sopenharmony_ci } 5806f6ba60Sopenharmony_ci // 'help' and 'version' start with "--" and are processed separately 5906f6ba60Sopenharmony_ci if (str.find("--help") != std::string::npos || str.find("--version") != std::string::npos) { 6006f6ba60Sopenharmony_ci std::vector<std::string> out; 6106f6ba60Sopenharmony_ci OHOS::SmartPerf::SPUtils::StrSplit(str, "-", out); 6206f6ba60Sopenharmony_ci if (out.size() != 1) { 6306f6ba60Sopenharmony_ci errorInfo = "--help and --version cannot be used together with other options"; 6406f6ba60Sopenharmony_ci return false; 6506f6ba60Sopenharmony_ci } else { 6606f6ba60Sopenharmony_ci return true; 6706f6ba60Sopenharmony_ci } 6806f6ba60Sopenharmony_ci } 6906f6ba60Sopenharmony_ci keys.insert("editor"); 7006f6ba60Sopenharmony_ci keys.insert("profilerfps"); 7106f6ba60Sopenharmony_ci keys.insert("start"); 7206f6ba60Sopenharmony_ci keys.insert("stop"); 7306f6ba60Sopenharmony_ci keys.insert("screen"); 7406f6ba60Sopenharmony_ci keys.insert("clear"); 7506f6ba60Sopenharmony_ci keys.insert("server"); 7606f6ba60Sopenharmony_ci keys.insert("sections"); 7706f6ba60Sopenharmony_ci keys.insert("deviceinfo"); 7806f6ba60Sopenharmony_ci keys.insert("ohtestfps"); 7906f6ba60Sopenharmony_ci keys.insert("editorServer"); 8006f6ba60Sopenharmony_ci keys.insert("recordcapacity"); 8106f6ba60Sopenharmony_ci for (auto a : OHOS::SmartPerf::COMMAND_MAP) { 8206f6ba60Sopenharmony_ci keys.insert(a.first.substr(1)); // No prefix required '-' 8306f6ba60Sopenharmony_ci } 8406f6ba60Sopenharmony_ci 8506f6ba60Sopenharmony_ci /* ************The command line for the following parameters is not implemented****************** */ 8606f6ba60Sopenharmony_ci auto itr = keys.find("f1"); 8706f6ba60Sopenharmony_ci if (keys.end() != itr) { 8806f6ba60Sopenharmony_ci keys.erase(itr); 8906f6ba60Sopenharmony_ci } 9006f6ba60Sopenharmony_ci itr = keys.find("f2"); 9106f6ba60Sopenharmony_ci if (keys.end() != itr) { 9206f6ba60Sopenharmony_ci keys.erase(itr); 9306f6ba60Sopenharmony_ci } 9406f6ba60Sopenharmony_ci itr = keys.find("fl"); 9506f6ba60Sopenharmony_ci if (keys.end() != itr) { 9606f6ba60Sopenharmony_ci keys.erase(itr); 9706f6ba60Sopenharmony_ci } 9806f6ba60Sopenharmony_ci itr = keys.find("ftl"); 9906f6ba60Sopenharmony_ci if (keys.end() != itr) { 10006f6ba60Sopenharmony_ci keys.erase(itr); 10106f6ba60Sopenharmony_ci } 10206f6ba60Sopenharmony_ci return OHOS::SmartPerf::SPUtils::VeriyParameter(keys, str, errorInfo); 10306f6ba60Sopenharmony_ci} 10406f6ba60Sopenharmony_ci 10506f6ba60Sopenharmony_cistatic void SocketStopCommand() 10606f6ba60Sopenharmony_ci{ 10706f6ba60Sopenharmony_ci OHOS::SmartPerf::ClientControl cc; 10806f6ba60Sopenharmony_ci cc.SocketStop(); 10906f6ba60Sopenharmony_ci} 11006f6ba60Sopenharmony_ci 11106f6ba60Sopenharmony_cistatic void RecordCapacity() 11206f6ba60Sopenharmony_ci{ 11306f6ba60Sopenharmony_ci const std::string capacityRmPath = "/sys/class/power_supply/Battery/capacity_rm"; 11406f6ba60Sopenharmony_ci const std::string capacitySavePath = "/data/local/tmp/powerLeftRecord.csv"; 11506f6ba60Sopenharmony_ci std::string capacityString; 11606f6ba60Sopenharmony_ci std::ifstream infile(capacitySavePath.c_str()); 11706f6ba60Sopenharmony_ci 11806f6ba60Sopenharmony_ci if (infile.is_open()) { 11906f6ba60Sopenharmony_ci std::stringstream buffer; 12006f6ba60Sopenharmony_ci int capacityLine = 0; 12106f6ba60Sopenharmony_ci std::string line; 12206f6ba60Sopenharmony_ci const int MAX_RECORD_COUNT = 100; 12306f6ba60Sopenharmony_ci buffer << infile.rdbuf(); 12406f6ba60Sopenharmony_ci capacityString = buffer.str(); 12506f6ba60Sopenharmony_ci infile.close(); 12606f6ba60Sopenharmony_ci 12706f6ba60Sopenharmony_ci while (std::getline(buffer, line)) { 12806f6ba60Sopenharmony_ci capacityLine++; 12906f6ba60Sopenharmony_ci } 13006f6ba60Sopenharmony_ci if (capacityLine == MAX_RECORD_COUNT) { 13106f6ba60Sopenharmony_ci std::size_t pos = capacityString.find('\n'); 13206f6ba60Sopenharmony_ci if (pos != std::string::npos) { 13306f6ba60Sopenharmony_ci capacityString = capacityString.substr(pos + 1); 13406f6ba60Sopenharmony_ci } 13506f6ba60Sopenharmony_ci } 13606f6ba60Sopenharmony_ci } 13706f6ba60Sopenharmony_ci 13806f6ba60Sopenharmony_ci std::ofstream outFile(capacitySavePath.c_str(), std::ios::out | std::ios::trunc); 13906f6ba60Sopenharmony_ci if (!outFile.is_open()) { 14006f6ba60Sopenharmony_ci std::cout << "Error opening capacity file!" << std::endl; 14106f6ba60Sopenharmony_ci return; 14206f6ba60Sopenharmony_ci } 14306f6ba60Sopenharmony_ci std::string recordPower; 14406f6ba60Sopenharmony_ci auto recordTime = std::to_string(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())); 14506f6ba60Sopenharmony_ci OHOS::SmartPerf::SPUtils::LoadFile(capacityRmPath, recordPower); 14606f6ba60Sopenharmony_ci std::cout << "recordTime: " << recordTime << std::endl << "recordPower: " << recordPower << std::endl; 14706f6ba60Sopenharmony_ci capacityString += recordTime + "," + recordPower; 14806f6ba60Sopenharmony_ci outFile << capacityString << std::endl; 14906f6ba60Sopenharmony_ci if (outFile.fail()) { 15006f6ba60Sopenharmony_ci const int bufSize = 256; 15106f6ba60Sopenharmony_ci char buf[bufSize] = { 0 }; 15206f6ba60Sopenharmony_ci std::cout << "Error writing capacity failed:" << strerror_r(errno, buf, bufSize) << std::endl; 15306f6ba60Sopenharmony_ci } 15406f6ba60Sopenharmony_ci outFile.close(); 15506f6ba60Sopenharmony_ci} 15606f6ba60Sopenharmony_ci 15706f6ba60Sopenharmony_cistatic int ProcessSpecificParameter(int argc, char *argv[], std::vector<std::string> &vec) 15806f6ba60Sopenharmony_ci{ 15906f6ba60Sopenharmony_ci if (argc > 1 && strcmp(argv[1], "-editor") == 0) { 16006f6ba60Sopenharmony_ci OHOS::SmartPerf::EditorCommand(argc, vec); 16106f6ba60Sopenharmony_ci return 0; 16206f6ba60Sopenharmony_ci } else if (argc > 1 && strcmp(argv[1], "-profilerfps") == 0) { 16306f6ba60Sopenharmony_ci OHOS::SmartPerf::ProfilerFPS::GetInstance().GetFPS(vec); 16406f6ba60Sopenharmony_ci return 0; 16506f6ba60Sopenharmony_ci } else if (argc > 1 && strcmp(argv[1], "-start") == 0) { 16606f6ba60Sopenharmony_ci OHOS::SmartPerf::ClientControl cc; 16706f6ba60Sopenharmony_ci cc.StartSPDaemon(); 16806f6ba60Sopenharmony_ci std::string result; 16906f6ba60Sopenharmony_ci for (int i = 2; i < argc; i++) { 17006f6ba60Sopenharmony_ci result += argv[i]; 17106f6ba60Sopenharmony_ci if (i != argc - 1) { 17206f6ba60Sopenharmony_ci result += " "; 17306f6ba60Sopenharmony_ci } 17406f6ba60Sopenharmony_ci } 17506f6ba60Sopenharmony_ci cc.SocketStart(result); 17606f6ba60Sopenharmony_ci return 1; 17706f6ba60Sopenharmony_ci } else if (argc > 1 && strcmp(argv[1], "-stop") == 0) { 17806f6ba60Sopenharmony_ci SocketStopCommand(); 17906f6ba60Sopenharmony_ci return 1; 18006f6ba60Sopenharmony_ci } else if (argc > 1 && strcmp(argv[1], "-deviceinfo") == 0) { 18106f6ba60Sopenharmony_ci std::cout << OHOS::SmartPerf::SPUtils::GetDeviceInfoMap() << std::endl; 18206f6ba60Sopenharmony_ci return 0; 18306f6ba60Sopenharmony_ci } else if (argc > 1 && strcmp(argv[1], "-ohtestfps") == 0) { 18406f6ba60Sopenharmony_ci OHOS::SmartPerf::ProfilerFPS::GetInstance().GetOhFps(vec); 18506f6ba60Sopenharmony_ci return 0; 18606f6ba60Sopenharmony_ci } else if (argc > 1 && strcmp(argv[1], "-recordcapacity") == 0) { 18706f6ba60Sopenharmony_ci RecordCapacity(); 18806f6ba60Sopenharmony_ci return 0; 18906f6ba60Sopenharmony_ci } 19006f6ba60Sopenharmony_ci 19106f6ba60Sopenharmony_ci return 1; 19206f6ba60Sopenharmony_ci} 19306f6ba60Sopenharmony_ci 19406f6ba60Sopenharmony_ciint main(int argc, char *argv[]) 19506f6ba60Sopenharmony_ci{ 19606f6ba60Sopenharmony_ci if (!OHOS::system::GetBoolParameter("const.security.developermode.state", true)) { 19706f6ba60Sopenharmony_ci std::cout << "Not a development mode state" << std::endl; 19806f6ba60Sopenharmony_ci return 0; 19906f6ba60Sopenharmony_ci } 20006f6ba60Sopenharmony_ci if (argc < 0) { 20106f6ba60Sopenharmony_ci std::cout << "Invalid argument count" << std::endl; 20206f6ba60Sopenharmony_ci return -1; 20306f6ba60Sopenharmony_ci } 20406f6ba60Sopenharmony_ci std::string errorInfo; 20506f6ba60Sopenharmony_ci std::vector<std::string> vec; 20606f6ba60Sopenharmony_ci 20706f6ba60Sopenharmony_ci for (int i = 0; i < argc; i++) { 20806f6ba60Sopenharmony_ci vec.push_back(argv[i]); 20906f6ba60Sopenharmony_ci } 21006f6ba60Sopenharmony_ci if (!g_checkCmdParam(vec, errorInfo)) { 21106f6ba60Sopenharmony_ci std::cout << "SP_daemon:" << errorInfo << std::endl << 21206f6ba60Sopenharmony_ci "Usage: SP_daemon [options] [arguments]" << std::endl << std::endl << 21306f6ba60Sopenharmony_ci "Try `SP_daemon --help' for more options." << std::endl; 21406f6ba60Sopenharmony_ci return 0; 21506f6ba60Sopenharmony_ci } 21606f6ba60Sopenharmony_ci OHOS::SmartPerf::SPUtils::SetRkFlag(); 21706f6ba60Sopenharmony_ci if (ProcessSpecificParameter(argc, argv, vec) == 0) { 21806f6ba60Sopenharmony_ci return 0; 21906f6ba60Sopenharmony_ci } 22006f6ba60Sopenharmony_ci OHOS::SmartPerf::SmartPerfCommand cmd(vec); 22106f6ba60Sopenharmony_ci std::cout << cmd.ExecCommand() << std::endl; 22206f6ba60Sopenharmony_ci return 0; 22306f6ba60Sopenharmony_ci} 224