1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_Timer.h
4 
5   Copyright (C)2009-2012 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: 47236 $
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 
56 */
57 class Timer : public WaitObject
58 {
59 public:
60 
61     /* Please see man pages for details
62 
63 
64 
65 
66 
67 
68      */
69     explicit Timer(bool isManualReset);
70 
Timer()71     Timer() {}
72 
73     /* Please see man pages for details
74 
75 
76 
77 
78 
79 
80 
81 
82      */
83     void Initialize(bool isManualReset);
84 
85     /* Please see man pages for details
86 
87 
88 
89 
90 
91 
92 
93 
94     */
95     nn::Result TryInitialize(bool isManualReset);
96 
97     /* Please see man pages for details
98 
99 
100 
101 
102     */
Finalize()103     void Finalize() { WaitObject::Finalize(); }
104 
105     /* Please see man pages for details
106 
107     */
~Timer()108     ~Timer() {}
109 
110     /* Please see man pages for details
111 
112 
113 
114 
115 
116     */
117     void StartOneShot(nn::fnd::TimeSpan timeSpan);
118 
119     /* Please see man pages for details
120 
121 
122 
123 
124 
125 
126 
127     */
128     void StartPeriodic(nn::fnd::TimeSpan first, nn::fnd::TimeSpan interval);
129 
130     /* Please see man pages for details
131 
132 
133 
134     */
135     void Signal();
136 
137     /* Please see man pages for details
138 
139 
140 
141 
142 
143 
144     */
Wait()145     void Wait() { this->WaitOne(); }
146 
147     /* Please see man pages for details
148 
149 
150 
151     */
152     void Stop();
153 
154     /* Please see man pages for details
155 
156 
157 
158 
159 
160     */
161     void ClearSignal();
162 
163     //----------------------------------------------------------------------
164     //
165     //
166     //
167     //
168     //
169     //
170     //
171     //
172     //----------------------------------------------------------------------
173     static s32  GetCurrentCount();
174 
175     //----------------------------------------------------------------------
176     //
177     //
178     //
179     //----------------------------------------------------------------------
180     static s32  GetMaxCount();
181 
182 private:
183 
184     Result TryInitializeImpl(bool isManualReset);
185     void StartImpl(nn::fnd::TimeSpan first, nn::fnd::TimeSpan interval);
186 
187 };
188 
189 // In-line implementation
190 
TryInitializeImpl(bool isManualReset)191 inline Result Timer::TryInitializeImpl(bool isManualReset)
192 {
193     Handle handle;
194     NN_UTIL_RETURN_IF_FAILED(nn::svc::CreateTimer(&handle, isManualReset));
195     this->SetHandle(handle);
196     return ResultSuccess();
197 }
198 
Initialize(bool isManualReset)199 inline void Timer::Initialize(bool isManualReset)
200 {
201     NN_OS_ERROR_IF_FAILED(TryInitializeImpl(isManualReset));
202 }
203 
TryInitialize(bool isManualReset)204 inline nn::Result Timer::TryInitialize(bool isManualReset)
205 {
206     Result result = TryInitializeImpl(isManualReset);
207     if (result.GetSummary() == Result::SUMMARY_OUT_OF_RESOURCE)
208     {
209         return result;
210     }
211     NN_OS_ERROR_IF_FAILED(result);
212     return result;
213 }
214 
Timer(bool isManualReset)215 inline Timer::Timer(bool isManualReset)
216 {
217     Initialize(isManualReset);
218 }
219 
StartImpl(nn::fnd::TimeSpan initial,nn::fnd::TimeSpan interval)220 inline void Timer::StartImpl(nn::fnd::TimeSpan initial, nn::fnd::TimeSpan interval)
221 {
222     NN_OS_ERROR_IF_FAILED(nn::svc::SetTimer(GetHandle(), initial.GetNanoSeconds(), interval.GetNanoSeconds()));
223 }
224 
StartPeriodic(nn::fnd::TimeSpan initial,nn::fnd::TimeSpan interval)225 inline void Timer::StartPeriodic(nn::fnd::TimeSpan initial, nn::fnd::TimeSpan interval)
226 {
227     NN_TASSERT_(interval > 0);
228     this->StartImpl(initial, interval);
229 }
230 
StartOneShot(nn::fnd::TimeSpan initial)231 inline void Timer::StartOneShot(nn::fnd::TimeSpan initial)
232 {
233     this->StartImpl(initial, 0);
234 }
235 
Signal()236 inline void Timer::Signal()
237 {
238     this->StartOneShot(0);
239 }
240 
Stop()241 inline void Timer::Stop()
242 {
243     NN_OS_ERROR_IF_FAILED(nn::svc::CancelTimer(GetHandle()));
244 }
245 
ClearSignal()246 inline void Timer::ClearSignal()
247 {
248     NN_OS_ERROR_IF_FAILED(nn::svc::ClearTimer(GetHandle()));
249 }
250 
251 }} // namespace nn::os
252 
253 #endif // __cplusplus
254 
255 // Below is the C declaration
256 
257 #include <nn/util/detail/util_CLibImpl.h>
258 
259 /* Please see man pages for details
260 
261 
262 
263 
264 
265 
266 
267 
268 */
269 
270 /* Please see man pages for details
271 
272 
273 
274 */
275 
276 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosTimer, nn::os::Timer, 4, u32);
277 NN_UTIL_DETAIL_CLIBIMPL_DECLARE_CONVERSION(nnosTimerToWaitObject, nnosTimer, nnosWaitObject);
278 NN_UTIL_DETAIL_CLIBIMPL_DECLARE_CONVERSION(nnosWaitObjectToTimer, nnosWaitObject, nnosTimer);
279 
280 
281 /* Please see man pages for details
282 
283 */
284 NN_EXTERN_C void nnosTimerInitialize(nnosTimer* this_, bool isManualReset);
285 
286 /* Please see man pages for details
287 
288 */
289 NN_EXTERN_C bool nnosTimerTryInitialize(nnosTimer* this_, bool isManualReset);
290 
291 /* Please see man pages for details
292 
293 */
294 NN_EXTERN_C void nnosTimerStartPeriodic(nnosTimer* this_, s64 first, s64 interval);
295 
296 /* Please see man pages for details
297 
298 */
299 NN_EXTERN_C void nnosTimerStartOneShot(nnosTimer* this_, s64 time);
300 
301 /* Please see man pages for details
302 
303 */
304 NN_EXTERN_C void nnosTimerWait(nnosTimer* this_);
305 
306 /* Please see man pages for details
307 
308 */
309 NN_EXTERN_C void nnosTimerStop(nnosTimer* this_);
310 
311 /* Please see man pages for details
312 
313 */
314 NN_EXTERN_C void nnosTimerClearSignal(nnosTimer* this_);
315 
316 /* Please see man pages for details
317 
318 */
319 NN_EXTERN_C void nnosTimerFinalize(nnosTimer* this_);
320 
321 /* Please see man pages for details
322 
323 */
324 NN_EXTERN_C void nnosTimerSignal(nnosTimer* this_);
325 
326 /*
327 
328 
329 
330 */
331 
332 #endif
333 
334