1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS - demos - event-1
3   File:     main.c
4 
5   Copyright 2007-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-12-08#$
14   $Rev: 9555 $
15   $Author: kitase_hirotake $
16  *---------------------------------------------------------------------------*/
17 #include <nitro.h>
18 
19 //---------------- defines
20 #define STACK_SIZE      1024
21 #define THREAD1_PRIO    20
22 #define COUNT           OS_MilliSecondsToTicks( 1000 )
23 
24 #define WAKEUP_EVENT    0x00000001
25 
26 //---------------- variables
27 OSThread thread1;
28 u64      stack1[STACK_SIZE / sizeof(u64)];
29 OSAlarm  alarm;
30 int      alarmCount = 0;
31 OSEvent  event;
32 
33 //---------------- prototypes
34 void alarmCallback(void* arg);
35 void VBlankIntr(void);
36 void proc1(void *arg);
37 
38 /*---------------------------------------------------------------------------*
39   Name:         NitroMain
40 
41   Description:  main
42 
43   Arguments:    None
44 
45   Returns:      None
46  *---------------------------------------------------------------------------*/
NitroMain(void)47 void NitroMain(void)
48 {
49     OS_Init();
50     OS_InitTick();
51     OS_InitAlarm();
52     OS_InitThread();
53 
54     //---- init event
55     OS_InitEvent(&event);
56 
57     //---- create thread
58     OS_CreateThread(&thread1,
59                     proc1,
60                     (void *)0x123,
61                     stack1 + STACK_SIZE / sizeof(u64),
62                     STACK_SIZE,
63                     THREAD1_PRIO);
64     OS_WakeupThreadDirect(&thread1);
65 
66     //---- interrupt setting
67     OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
68     (void)OS_EnableIrqMask(OS_IE_V_BLANK);
69     (void)OS_EnableIrq();
70     (void)GX_VBlankIntr(TRUE);
71 
72     OS_Printf("*** start event-1 demo\n");
73 
74     //---- alarm
75     OS_SetPeriodicAlarm( &alarm, COUNT, COUNT, alarmCallback, NULL );
76 
77     //---- main loop
78     while( alarmCount <= 10 )
79     {
80         static u16 prevButton = 0;
81         u16 button = PAD_Read();
82         u16 trigger = (u16)((button ^ prevButton) & button);
83         prevButton = button;
84 
85         SVC_WaitVBlankIntr();
86 
87         if ( trigger & PAD_BUTTON_A )
88         {
89             //---- signal event
90             OS_SignalEvent(&event, WAKEUP_EVENT);
91         }
92     }
93 
94     OS_Printf("==== Finish sample.\n");
95     OS_Terminate();
96 }
97 
98 
99 /*---------------------------------------------------------------------------*
100   Name:         alarmCallback
101 
102   Description:  alarm handler
103 
104   Arguments:    arg :
105 
106   Returns:      None
107  *---------------------------------------------------------------------------*/
alarmCallback(void * arg)108 void alarmCallback(void* arg)
109 {
110 #pragma unused(arg)
111     OS_Printf( "alarm callback (%d)\n", alarmCount );
112     alarmCount ++;
113 
114     //---- signal event
115     OS_SignalEvent(&event, WAKEUP_EVENT);
116 }
117 
118 /*---------------------------------------------------------------------------*
119   Name:         VBlankIntr
120 
121   Description:  vblank handler
122 
123   Arguments:    None
124 
125   Returns:      None
126  *---------------------------------------------------------------------------*/
VBlankIntr(void)127 void VBlankIntr(void)
128 {
129     OS_SetIrqCheckFlag(OS_IE_V_BLANK);
130 }
131 
132 /*---------------------------------------------------------------------------*
133   Name:         proc1
134 
135   Description:  thread1
136 
137   Arguments:    arg :
138 
139   Returns:      None
140  *---------------------------------------------------------------------------*/
proc1(void * arg)141 void proc1(void *arg)
142 {
143 #pragma unused( arg )
144     while (1)
145     {
146         //---- wait event
147         (void)OS_WaitEventEx(&event, WAKEUP_EVENT, OS_EVENT_MODE_AND, WAKEUP_EVENT);
148 
149         OS_Printf("Thread1\n");
150     }
151 }
152