1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_Timer.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 38846 $
14  *---------------------------------------------------------------------------*/
15 
16 /* Please see man pages for details
17 
18 
19 */
20 
21 #ifndef NN_OS_OS_TIMER_H_
22 #define NN_OS_OS_TIMER_H_
23 
24 #include <nn/types.h>
25 #include <nn/Handle.h>
26 #include <nn/Result.h>
27 #include <nn/os/os_Synchronization.h>
28 #include <nn/os/os_ErrorHandlerSelect.h>
29 #include <nn/fnd/fnd_TimeSpan.h>
30 
31 #include <nn/util/util_Result.h>
32 
33 #ifdef __cplusplus
34 
35 namespace nn{ namespace os {
36 
37 /* Please see man pages for details
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 */
55 class Timer : public WaitObject
56 {
57 public:
58 
59     /* Please see man pages for details
60 
61 
62 
63 
64 
65 
66      */
67     explicit Timer(bool isManualReset);
68 
Timer()69     Timer() {}
70 
71     /* Please see man pages for details
72 
73 
74 
75 
76 
77 
78 
79 
80      */
81     void Initialize(bool isManualReset);
82 
83     /* Please see man pages for details
84 
85 
86 
87 
88 
89 
90 
91 
92     */
93     nn::Result TryInitialize(bool isManualReset);
94 
95     /* Please see man pages for details
96 
97 
98 
99 
100     */
Finalize()101     void Finalize() { WaitObject::Finalize(); }
102 
103     /* Please see man pages for details
104 
105     */
~Timer()106     ~Timer() {}
107 
108     /* Please see man pages for details
109 
110 
111 
112 
113 
114     */
115     void StartOneShot(nn::fnd::TimeSpan timeSpan);
116 
117     /* Please see man pages for details
118 
119 
120 
121 
122 
123 
124 
125     */
126     void StartPeriodic(nn::fnd::TimeSpan first, nn::fnd::TimeSpan interval);
127 
128     /* Please see man pages for details
129 
130 
131 
132     */
133     void Signal();
134 
135     /* Please see man pages for details
136 
137 
138 
139 
140 
141 
142     */
Wait()143     void Wait() { this->WaitOne(); }
144 
145     /* Please see man pages for details
146 
147 
148 
149     */
150     void Stop();
151 
152     /* Please see man pages for details
153 
154 
155 
156 
157 
158     */
159     void ClearSignal();
160 
161 private:
162 
163     Result TryInitializeImpl(bool isManualReset);
164     void StartImpl(nn::fnd::TimeSpan first, nn::fnd::TimeSpan interval);
165 
166 };
167 
168 // Inline implementation
169 
TryInitializeImpl(bool isManualReset)170 inline Result Timer::TryInitializeImpl(bool isManualReset)
171 {
172     Handle handle;
173     NN_UTIL_RETURN_IF_FAILED(nn::svc::CreateTimer(&handle, isManualReset));
174     this->SetHandle(handle);
175     return ResultSuccess();
176 }
177 
Initialize(bool isManualReset)178 inline void Timer::Initialize(bool isManualReset)
179 {
180     NN_OS_ERROR_IF_FAILED(TryInitializeImpl(isManualReset));
181 }
182 
TryInitialize(bool isManualReset)183 inline nn::Result Timer::TryInitialize(bool isManualReset)
184 {
185     Result result = TryInitializeImpl(isManualReset);
186     if (result.GetSummary() == Result::SUMMARY_OUT_OF_RESOURCE)
187     {
188         return result;
189     }
190     NN_OS_ERROR_IF_FAILED(result);
191     return result;
192 }
193 
Timer(bool isManualReset)194 inline Timer::Timer(bool isManualReset)
195 {
196     Initialize(isManualReset);
197 }
198 
StartImpl(nn::fnd::TimeSpan initial,nn::fnd::TimeSpan interval)199 inline void Timer::StartImpl(nn::fnd::TimeSpan initial, nn::fnd::TimeSpan interval)
200 {
201     NN_OS_ERROR_IF_FAILED(nn::svc::SetTimer(GetHandle(), initial.GetNanoSeconds(), interval.GetNanoSeconds()));
202 }
203 
StartPeriodic(nn::fnd::TimeSpan initial,nn::fnd::TimeSpan interval)204 inline void Timer::StartPeriodic(nn::fnd::TimeSpan initial, nn::fnd::TimeSpan interval)
205 {
206     NN_TASSERT_(interval > 0);
207     this->StartImpl(initial, interval);
208 }
209 
StartOneShot(nn::fnd::TimeSpan initial)210 inline void Timer::StartOneShot(nn::fnd::TimeSpan initial)
211 {
212     this->StartImpl(initial, 0);
213 }
214 
Signal()215 inline void Timer::Signal()
216 {
217     this->StartOneShot(0);
218 }
219 
Stop()220 inline void Timer::Stop()
221 {
222     NN_OS_ERROR_IF_FAILED(nn::svc::CancelTimer(GetHandle()));
223 }
224 
ClearSignal()225 inline void Timer::ClearSignal()
226 {
227     NN_OS_ERROR_IF_FAILED(nn::svc::ClearTimer(GetHandle()));
228 }
229 
230 }} // namesapce nn::os
231 
232 #endif // __cplusplus
233 
234 // C declarations follow
235 
236 #include <nn/util/detail/util_CLibImpl.h>
237 
238 /* Please see man pages for details
239 
240 
241 
242 
243 
244 
245 
246 
247 */
248 
249 /* Please see man pages for details
250 
251 
252 
253 */
254 
255 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosTimer, nn::os::Timer, 4, u32);
256 NN_UTIL_DETAIL_CLIBIMPL_DECLARE_CONVERSION(nnosTimerToWaitObject, nnosTimer, nnosWaitObject);
257 NN_UTIL_DETAIL_CLIBIMPL_DECLARE_CONVERSION(nnosWaitObjectToTimer, nnosWaitObject, nnosTimer);
258 
259 
260 /* Please see man pages for details
261 
262 */
263 NN_EXTERN_C void nnosTimerInitialize(nnosTimer* this_, bool isManualReset);
264 
265 /* Please see man pages for details
266 
267 */
268 NN_EXTERN_C bool nnosTimerTryInitialize(nnosTimer* this_, bool isManualReset);
269 
270 /* Please see man pages for details
271 
272 */
273 NN_EXTERN_C void nnosTimerStartPeriodic(nnosTimer* this_, s64 first, s64 interval);
274 
275 /* Please see man pages for details
276 
277 */
278 NN_EXTERN_C void nnosTimerStartOneShot(nnosTimer* this_, s64 time);
279 
280 /* Please see man pages for details
281 
282 */
283 NN_EXTERN_C void nnosTimerWait(nnosTimer* this_);
284 
285 /* Please see man pages for details
286 
287 */
288 NN_EXTERN_C void nnosTimerStop(nnosTimer* this_);
289 
290 /* Please see man pages for details
291 
292 */
293 NN_EXTERN_C void nnosTimerClearSignal(nnosTimer* this_);
294 
295 /* Please see man pages for details
296 
297 */
298 NN_EXTERN_C void nnosTimerFinalize(nnosTimer* this_);
299 
300 /* Please see man pages for details
301 
302 */
303 NN_EXTERN_C void nnosTimerSignal(nnosTimer* this_);
304 
305 /*
306 
307 
308 
309 */
310 
311 #endif
312 
313