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