1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - OS - demos - alarm-2
3 File: main.c
4
5 Copyright 2003-2008 Nintendo. 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 $Date:: 2008-04-01#$
14 $Rev: 5205 $
15 $Author: yada $
16 *---------------------------------------------------------------------------*/
17 #include <nitro.h>
18
19 #define ALARM_COUNT (OS_MilliSecondsToTicks(1000))
20 #define ALARM_COUNT_P1 (OS_MilliSecondsToTicks(400))
21 #define ALARM_COUNT_P2 (OS_MilliSecondsToTicks(500))
22
23 #define TEST_DATA 0x12345678
24 #define TEST_DATA2 0x9abcdef0
25
26 static OSAlarm alarm;
27 static OSAlarm alarm2;
28
29 static BOOL called = FALSE;
30 static BOOL alarm2_sw = FALSE;
31
32 static int pushCounter = 0;
33 static int pushCounter2 = 0;
34
35 void alarmCallback(void *arg);
36 void alarmCallback2(void *arg);
37 void VBlankIntr(void);
38
39 /*---------------------------------------------------------------------------*
40 Name: NitroMain
41
42 Description: main
43
44 Arguments: None
45
46 Returns: None
47 *---------------------------------------------------------------------------*/
NitroMain()48 void NitroMain()
49 {
50 OS_Init();
51 GX_Init();
52
53 // ---- initialize tick system
54 OS_InitTick();
55 // ---- initialize alarm system
56 OS_InitAlarm();
57
58 //---- setup VBlank
59 (void)OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
60 (void)OS_EnableIrqMask(OS_IE_V_BLANK);
61 (void)OS_EnableIrq();
62 (void)GX_VBlankIntr(TRUE);
63
64 OS_Printf("Push [A] to start alarm.\n");
65 OS_Printf("Push [UP] to start periodic alarm. ([DOWN] to stop)\n");
66
67 while (1)
68 {
69 u16 padData;
70 u16 trigger;
71 static u16 prePadData = 0;
72
73 OS_WaitVBlankIntr();
74 padData = PAD_Read();
75 trigger = (u16)((padData ^ prePadData) & padData);
76 prePadData = padData;
77
78 //---- push A to start alarm
79 if (trigger & PAD_BUTTON_A && !called)
80 {
81 pushCounter++;
82 called = TRUE;
83
84 //---- setting alarm
85 OS_CreateAlarm(&alarm);
86 OS_SetAlarm(&alarm, ALARM_COUNT, &alarmCallback, (void *)pushCounter);
87
88 OS_Printf("set alarm\n");
89 }
90
91
92 //---- push UP to start periodic alarm
93 if (trigger & PAD_KEY_UP && !alarm2_sw)
94 {
95 pushCounter2++;
96 alarm2_sw = TRUE;
97
98 //---- setting periodic alarm
99 OS_CreateAlarm(&alarm2);
100 OS_SetPeriodicAlarm(&alarm2, OS_GetTick() + ALARM_COUNT_P1, ALARM_COUNT_P2,
101 &alarmCallback2, (void *)(1000 + pushCounter2));
102
103 OS_Printf("set periodic alarm\n");
104 }
105
106 //---- push DOWN to stop periodic alarm
107 if (trigger & PAD_KEY_DOWN && alarm2_sw)
108 {
109 alarm2_sw = FALSE;
110
111 OS_CancelAlarm(&alarm2);
112 }
113 }
114 }
115
116
117 /*---------------------------------------------------------------------------*
118 Name: alarmCallback
119
120 Description: callback for alarm interrupt
121
122 Arguments: arg : user setting argument
123
124 Returns: None
125 *---------------------------------------------------------------------------*/
alarmCallback(void * arg)126 void alarmCallback(void *arg)
127 {
128 #ifdef SDK_FINALROM
129 #pragma unused( arg )
130 #endif
131 OS_Printf(">>> called alarm callback. arg=%d\n", arg);
132 called = FALSE;
133 }
134
135 /*---------------------------------------------------------------------------*
136 Name: alarmCallback2
137
138 Description: callback for alarm interrupt, for periodic alarm
139
140 Arguments: arg : user setting argument
141
142 Returns: None
143 *---------------------------------------------------------------------------*/
alarmCallback2(void * arg)144 void alarmCallback2(void *arg)
145 {
146 #ifdef SDK_FINALROM
147 #pragma unused( arg )
148 #endif
149 OS_Printf(">>> called periodic alarm callback. arg=%d TICK=%llx\n", arg, OS_GetTick());
150 }
151
152 /*---------------------------------------------------------------------------*
153 Name: VBlankIntr
154
155 Description: VBlank interrupt handler
156
157 Arguments: None
158
159 Returns: None
160 *---------------------------------------------------------------------------*/
VBlankIntr(void)161 void VBlankIntr(void)
162 {
163 //---- check interrupt flag
164 OS_SetIrqCheckFlag(OS_IE_V_BLANK);
165 }
166
167 /*====== End of main.c ======*/
168