Files
Horizon-OC/Source/sys-clk-OC/manager/src/refresh_task.cpp
2021-08-29 15:00:45 +08:00

94 lines
3.2 KiB
C++

/*
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 <https://www.gnu.org/licenses/>.
*/
#include "refresh_task.h"
#include "utils.h"
#define REFRESH_INTERVAL 400
RefreshTask::RefreshTask() : RepeatingTask(REFRESH_INTERVAL)
{
}
void RefreshTask::onStart()
{
Result rc = sysclkIpcGetCurrentContext(&this->oldContext);
if (R_FAILED(rc))
{
brls::Logger::error("Unable to get context");
errorResult("sysclkIpcGetCurrentContext", rc);
}
}
void RefreshTask::run(retro_time_t currentTime)
{
RepeatingTask::run(currentTime);
// Get new context
SysClkContext context;
if (R_SUCCEEDED(sysclkIpcGetCurrentContext(&context)))
{
// CPU Freq
if (context.freqs[SysClkModule_CPU] != this->oldContext.freqs[SysClkModule_CPU])
this->freqUpdateEvent.fire(SysClkModule_CPU, context.freqs[SysClkModule_CPU]);
// GPU Freq
if (context.freqs[SysClkModule_GPU] != this->oldContext.freqs[SysClkModule_GPU])
this->freqUpdateEvent.fire(SysClkModule_GPU, context.freqs[SysClkModule_GPU]);
// MEM Freq
if (context.freqs[SysClkModule_MEM] != this->oldContext.freqs[SysClkModule_MEM])
this->freqUpdateEvent.fire(SysClkModule_MEM, context.freqs[SysClkModule_MEM]);
// Application ID
if (context.applicationId != this->oldContext.applicationId)
this->appIdUpdateEvent.fire(context.applicationId);
// Profile
if (context.profile != this->oldContext.profile)
this->profileUpdateEvent.fire(context.profile);
// Only notify temp changes every other tick
if (this->shouldNotifyTempChange)
{
// PCB Temp
if (context.temps[SysClkThermalSensor_PCB] != this->oldContext.temps[SysClkThermalSensor_PCB])
this->tempUpdateEvent.fire(SysClkThermalSensor_PCB, context.temps[SysClkThermalSensor_PCB]);
//SoC Temp
if (context.temps[SysClkThermalSensor_SOC] != this->oldContext.temps[SysClkThermalSensor_SOC])
this->tempUpdateEvent.fire(SysClkThermalSensor_SOC, context.temps[SysClkThermalSensor_SOC]);
//Skin Temp
if (context.temps[SysClkThermalSensor_Skin] != this->oldContext.temps[SysClkThermalSensor_Skin])
this->tempUpdateEvent.fire(SysClkThermalSensor_Skin, context.temps[SysClkThermalSensor_Skin]);
}
this->shouldNotifyTempChange = !this->shouldNotifyTempChange;
this->oldContext = context;
}
else
{
brls::Logger::error("Unable to refresh context");
}
}