/* sys-clk manager, a sys-clk frontend homebrew Copyright (C) 2019 natinusala Copyright (C) 2019 p-sam Copyright (C) 2019 m4xw This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "utils.h" #include #include "ipc/client.h" uint32_t g_freq_table_hz[SysClkModule_EnumMax][SYSCLK_FREQ_LIST_MAX+1]; Result cacheFreqList() { Result rc; for(uint32_t i = 0; i < SysClkModule_EnumMax; i++) { rc = sysclkIpcGetFreqList((SysClkModule)i, &g_freq_table_hz[i][1], SYSCLK_FREQ_LIST_MAX, &g_freq_table_hz[i][0]); if(R_FAILED(rc)) { return rc; } } return 0; } std::string formatFreq(uint32_t freq) { char str[16]; snprintf(str, sizeof(str), "%.1f MHz", (float)freq / 1000000.0f); return std::string(str); } std::string formatTid(uint64_t tid) { char str[17]; snprintf(str, sizeof(str), "%016lX", tid); return std::string(str); } std::string formatProfile(SysClkProfile profile) { return std::string(sysclkFormatProfile(profile, true)); } std::string formatTemp(uint32_t temp) { char str[16]; snprintf(str, sizeof(str), "%.1f °C", (float)temp / 1000.0f); return std::string(str); } std::string formatPower(int32_t power) { char str[16]; snprintf(str, sizeof(str), "%d mW", power); return std::string(str); } void errorResult(std::string tag, Result rc) { #ifdef __SWITCH__ brls::Logger::error("[0x%x] %s failed - %04d-%04d", rc, tag.c_str(), R_MODULE(rc), R_DESCRIPTION(rc)); #else brls::Logger::error("[0x%x] %s failed - xxxx-xxxx", rc, tag.c_str()); #endif } // TODO: Merge ticker for single line labels in Borealis and remove usage of this std::string formatListItemTitle(const std::string str, size_t maxScore) { size_t score = 0; for (size_t i = 0; i < str.length(); i++) { score += std::isupper(str[i]) ? 4 : 3; if(score > maxScore) { return str.substr(0, i-1) + "\u2026"; } } return str; } brls::SelectListItem* createFreqListItem(SysClkModule module, uint32_t selectedFreqInMHz, std::string defaultString) { std::string name; switch (module) { case SysClkModule_CPU: name = "CPU Frequency"; break; case SysClkModule_GPU: name = "GPU Frequency"; break; case SysClkModule_MEM: name = "MEM Frequency"; break; default: return nullptr; } uint32_t* table = &g_freq_table_hz[module][0]; size_t selected = 0; size_t i = 1; std::vector clocks; clocks.push_back(defaultString); while (i <= table[0]) { uint32_t freq = table[i]; if (freq / 1000000 == selectedFreqInMHz) selected = i; char clock[16]; snprintf(clock, sizeof(clock), "%d MHz", freq / 1000000); clocks.push_back(std::string(clock)); i++; } return new brls::SelectListItem(name, clocks, selected); }