diff --git a/Source/rewrite-hoc-clk/sysmodule/src/board/board_init.cpp b/Source/rewrite-hoc-clk/sysmodule/src/board/board_init.cpp index a6720770..a97fa6e4 100644 --- a/Source/rewrite-hoc-clk/sysmodule/src/board/board_init.cpp +++ b/Source/rewrite-hoc-clk/sysmodule/src/board/board_init.cpp @@ -111,19 +111,9 @@ namespace board { ASSERT_RESULT_OK(rc, "pmdmntInitialize"); StartGpuLoad(nvCheck, fd); - - leventClear(&threadexit); - threadCreate(&cpuCore0Thread, CheckCore, &idletick0, NULL, 0x1000, 0x10, 0); - threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1); - threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2); // threadCreate(&cpuCore3Thread, CheckCore, &idletick3, NULL, 0x1000, 0x10, 3); threadCreate(&miscThread, miscThreadFunc, NULL, NULL, 0x1000, 0x10, 3); - threadStart(&cpuCore0Thread); - threadStart(&cpuCore1Thread); - threadStart(&cpuCore2Thread); - // threadStart(&cpuCore3Thread); - threadStart(&miscThread); batteryInfoInitialize(); FetchHardwareInfos(); @@ -177,7 +167,6 @@ namespace board { ExitLoad(); - // threadClose(&cpuCore3Thread); threadClose(&miscThread); pwmChannelSessionClose(&g_ICon); diff --git a/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.cpp b/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.cpp index ece59a2b..272dd0c8 100644 --- a/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.cpp @@ -25,13 +25,28 @@ */ #include +#include +#include +#include namespace board { Thread gpuThread; + LEvent threadexit; + Thread cpuCore0Thread; + Thread cpuCore1Thread; + Thread cpuCore2Thread; + u32 gpuLoad; u32 _fd; + u64 idletick0 = 0; + u64 idletick1 = 0; + u64 idletick2 = 0; + + constexpr u64 CpuTimeOutNs = 500'000'000; + constexpr double Systemtickfrequency = 19200000.0 * (static_cast(CpuTimeOutNs) / 1'000'000'000.0); + void GpuLoadThread(Result *nvCheck) { constexpr u32 GpuSamples = 8; u32 gpu_load_array[GpuSamples] = {}; @@ -49,18 +64,52 @@ namespace board { } void StartGpuLoad(Result nvCheck, u32 fd) { - _fd = fd; + ; + } + u32 GetGpuLoad() { + return gpuLoad; + } + + void CheckCore(void *idletickPtr) { + u64* idletick = static_cast(idletickPtr); + while(true) { + u64 idletickA; + u64 idletickB; + svcGetInfo(&idletickB, InfoType_IdleTickCount, INVALID_HANDLE, -1); + svcWaitForAddress(&threadexit, ArbitrationType_WaitIfEqual, 0, CpuTimeOutNs); + svcGetInfo(&idletickA, InfoType_IdleTickCount, INVALID_HANDLE, -1); + *idletick = idletickA - idletickB; + } + } + + void StartLoad() { + _fd = fd; threadCreate(&gpuThread, GpuLoadThread, &nvCheck, NULL, 0x1000, 0x3F, -2); - threadStart(&gpuThread); + threadStart(&gpuThread) + + leventClear(&threadexit); + threadCreate(&cpuCore0Thread, CheckCore, &idletick0, NULL, 0x1000, 0x10, 0); + threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1); + threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2); + + threadStart(&cpuCore0Thread); + threadStart(&cpuCore1Thread); + threadStart(&cpuCore2Thread); + } + + u32 GetMaxCpuLoad() { + float cpuUsage0 = std::clamp(((Systemtickfrequency - idletick0) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); + float cpuUsage1 = std::clamp(((Systemtickfrequency - idletick1) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); + float cpuUsage2 = std::clamp(((Systemtickfrequency - idletick2) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); + return std::round(std::max({cpuUsage0, cpuUsage1, cpuUsage2})); } void ExitLoad() { - threadClose(gpuThread); - } - - void StartCpuLoad() { - + threadClose(&gpuThread); + threadClose(&cpuCore0Thread); + threadClose(&cpuCore1Thread); + threadClose(&cpuCore2Thread); } } diff --git a/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.hpp b/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.hpp index 5c5b3ed4..ead57f59 100644 --- a/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.hpp +++ b/Source/rewrite-hoc-clk/sysmodule/src/board/board_load.hpp @@ -25,11 +25,13 @@ */ #pragma once +#include namespace board { - void StartGpuLoad(Result nvCheck, u32 fd); - void StartCpuLoad(); + void StartLoad(Result nvCheck, u32 fd); void ExitLoad(); + u32 GetGpuLoad(); + u32 GetMaxCpuLoad(); }