4#ifndef _Stroika_Frameworks_Led_IdleManager_h_
5#define _Stroika_Frameworks_Led_IdleManager_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
20#include "Stroika/Frameworks/Led/Support.h"
22namespace Stroika::Frameworks::Led {
35 virtual void SpendIdleTime ();
44 EnterIdler () =
default;
47 virtual void OnEnterIdle ();
60 static IdleManager& Get ();
63 virtual void AddIdler (Idler* idler);
64 virtual void RemoveIdler (Idler* idler);
67 virtual void AddEnterIdler (EnterIdler* enterIdler);
68 virtual void RemoveEnterIdler (EnterIdler* enterIdler);
71 nonvirtual
bool GetInIdleMode ()
const;
72 nonvirtual
void SetInIdleMode (
bool inIdleMode);
75 bool fInIdleMode_{
false};
78 static inline Foundation::Time::DurationSeconds kNeverCallIdler{100s};
79 virtual Foundation::Time::DurationSeconds GetIdlerFrequncy (Idler* idler);
80 virtual void SetIdlerFrequncy (Idler* idler, Foundation::Time::DurationSeconds idlerFrequency);
86 unsigned int fNonIdleContextCount;
89 friend class NonIdleContext;
92 class IdleManagerOSImpl;
95 static void SetIdleManagerOSImpl (IdleManagerOSImpl* impl);
98 IdleManagerOSImpl* fIdleManagerOSImpl;
101 friend class IdleManagerOSImpl;
104 nonvirtual
void UpdateIdleMgrImplState ();
107 virtual void CallSpendTime ();
108 virtual void CallEnterIdle ();
112 IdlerInfo () =
default;
113 Foundation::Time::DurationSeconds fIdlerFrequency{IdleManager::kNeverCallIdler};
114 Foundation::Time::TimePointSeconds fLastCalledAt{};
116 map<Idler*, IdlerInfo> fIdlers;
117 bool fNeedMgrIdleCalls;
120 vector<EnterIdler*> fEnterIdlers;
127 class IdleManager::NonIdleContext {
139 class IdleManager::IdleManagerOSImpl {
141 IdleManagerOSImpl () =
default;
144 virtual void StartSpendTimeCalls () = 0;
145 virtual void TerminateSpendTimeCalls () = 0;
146 virtual Foundation::Time::DurationSeconds GetSuggestedFrequency ()
const = 0;
147 virtual void SetSuggestedFrequency (Foundation::Time::DurationSeconds suggestedFrequency) = 0;
150 virtual void CallSpendTime ();
160#include "IdleManager.inl"