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