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