4#include "Stroika/Frameworks/StroikaPreComp.h"
10#include "IdleManager.h"
13using namespace Stroika::Frameworks;
14using namespace Stroika::Frameworks::Led;
21void Idler::SpendIdleTime ()
30void EnterIdler::OnEnterIdle ()
40void IdleManager::AddIdler (Idler* idler)
43 Require (fIdlers.find (idler) == fIdlers.end ());
45 fIdlers.insert (map<Idler*, IdlerInfo>::value_type (idler, idlerInfo));
48void IdleManager::RemoveIdler (Idler* idler)
51 map<Idler*, IdlerInfo>::iterator i = fIdlers.find (idler);
52 Require (i != fIdlers.end ());
53 Assert (i->first == idler);
57void IdleManager::AddEnterIdler (EnterIdler* enterIdler)
60 Require (find (fEnterIdlers.begin (), fEnterIdlers.end (), enterIdler) == fEnterIdlers.end ());
61 fEnterIdlers.push_back (enterIdler);
62 UpdateIdleMgrImplState ();
65void IdleManager::RemoveEnterIdler (EnterIdler* enterIdler)
68 vector<EnterIdler*>::iterator i = find (fEnterIdlers.begin (), fEnterIdlers.end (), enterIdler);
69 Require (i != fEnterIdlers.end ());
70 Assert (*i == enterIdler);
71 fEnterIdlers.erase (i);
72 UpdateIdleMgrImplState ();
78 map<Idler*, IdlerInfo>::iterator i = fIdlers.find (idler);
79 Require (i != fIdlers.end ());
80 Assert (i->first == idler);
81 return i->second.fIdlerFrequency;
87 map<Idler*, IdlerInfo>::iterator i = fIdlers.find (idler);
88 Require (i != fIdlers.end ());
89 Assert (i->first == idler);
90 if (i->second.fIdlerFrequency != idlerFrequency) {
91 i->second.fIdlerFrequency = idlerFrequency;
92 UpdateIdleMgrImplState ();
96void IdleManager::UpdateIdleMgrImplState ()
98 if (fIdleManagerOSImpl !=
nullptr) {
100 for (
auto i = fIdlers.begin (); i != fIdlers.end (); ++i) {
101 idleFreq = min (idleFreq, i->second.fIdlerFrequency);
103 if (not fEnterIdlers.empty ()) {
105 idleFreq = min (idleFreq, kMinEnterIdleFreqCheck);
107 bool shouldNeedIdleMgr = (idleFreq != kNeverCallIdler);
108 if (shouldNeedIdleMgr != fNeedMgrIdleCalls or (shouldNeedIdleMgr and idleFreq != fIdleManagerOSImpl->GetSuggestedFrequency ())) {
109 fNeedMgrIdleCalls = shouldNeedIdleMgr;
110 if (fNeedMgrIdleCalls) {
111 fIdleManagerOSImpl->SetSuggestedFrequency (idleFreq);
112 fIdleManagerOSImpl->StartSpendTimeCalls ();
115 fIdleManagerOSImpl->TerminateSpendTimeCalls ();
121void IdleManager::CallSpendTime ()
123 SetInIdleMode (
true);
125 for (
auto i = fIdlers.begin (); i != fIdlers.end (); ++i) {
127 if (i->second.fLastCalledAt + i->second.fIdlerFrequency <= now) {
128 Idler* idler = i->first;
129 idler->SpendIdleTime ();
130 now = Time::GetTickCount ();
131 i->second.fLastCalledAt = now;
136void IdleManager::CallEnterIdle ()
138 for (
auto i = fEnterIdlers.begin (); i != fEnterIdlers.end (); ++i) {
139 EnterIdler* enterIdler = *i;
141 enterIdler->OnEnterIdle ();
145void IdleManager::SetIdleManagerOSImpl (IdleManagerOSImpl* impl)
151 if (impl ==
nullptr) {
152 Get ().fIdleManagerOSImpl =
nullptr;
155 Get ().fIdleManagerOSImpl = impl;
164void IdleManager::IdleManagerOSImpl::CallSpendTime ()
166 IdleManager::Get ().CallSpendTime ();
#define RequireNotNull(p)
time_point< RealtimeClock, DurationSeconds > TimePointSeconds
TimePointSeconds is a simpler approach to chrono::time_point, which doesn't require using templates e...
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.