/*---------------------------------------------------------------------------* Project: TwlSDK - OS File: os_event.c Copyright 2007-2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: $ $Rev$ $Author$ *---------------------------------------------------------------------------*/ /* #ifdef SDK_TWL #include #else #include #endif*/ #include #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9) #include #endif /*---------------------------------------------------------------------------* Name: OS_InitEvent Description: initialize event struct Arguments: event : pointer to event struct Returns: none *---------------------------------------------------------------------------*/ void osInitEvent( OSEvent *event ) { osInitThreadQueue( &event->queue ); event->flag = 0; } /*---------------------------------------------------------------------------* Name: osWaitEvent Description: sleep thread and wait event if event is NULL, just sleep. Arguments: event : pointer to event struct pattern : event pattern mode : event mode OS_EVENT_MODE_AND ... wait for all event bit OS_EVENT_MODE_OR ... wait for any event bit Returns: none *---------------------------------------------------------------------------*/ u32 osWaitEvent(OSEvent* event, u32 pattern, OSEventMode mode ) { return osWaitEventEx(event, pattern, mode, 0); } /*---------------------------------------------------------------------------* Name: osWaitEventEx Description: sleep thread and wait event if event is NULL, just sleep. Arguments: event : pointer to event struct pattern : event pattern mode : event mode OS_EVENT_MODE_AND ... wait for all event bit OS_EVENT_MODE_OR ... wait for any event bit clearBit : clear bits (in case of the end of waiting) Returns: none *---------------------------------------------------------------------------*/ u32 osWaitEventEx(OSEvent* event, u32 pattern, OSEventMode mode, u32 clearBit ) { u32 retval = 0; OSIntrMode enable = osDisableInterrupts(); SDK_ASSERT( event ); switch( mode ) { case OS_EVENT_MODE_AND: while( (event->flag & pattern) != pattern ) { osSleepThread(&event->queue); } retval = event->flag; break; case OS_EVENT_MODE_OR: while( (event->flag & pattern) == 0 ) { osSleepThread(&event->queue); } retval = event->flag; break; } //---- clear flag if ( retval ) { event->flag &= ~clearBit; } (void)osRestoreInterrupts(enable); return retval; } /*---------------------------------------------------------------------------* Name: osSignalEvent Description: set event bit and wakeup thread. if setPattern == 0, do nothing Arguments: event : pointer to event struct setPattern : bit pattern to set Returns: none *---------------------------------------------------------------------------*/ void osSignalEvent(OSEvent* event, u32 setPattern) { OSIntrMode enable = osDisableInterrupts(); SDK_ASSERT( event ); if ( setPattern ) { event->flag |= setPattern; osWakeupThread( &event->queue ); } (void)osRestoreInterrupts(enable); } /*---------------------------------------------------------------------------* Name: osClearAllEvent Description: clear all event bits Arguments: event : pointer to event struct Returns: none *---------------------------------------------------------------------------*/ void osClearAllEvent(OSEvent* event) { SDK_ASSERT( event ); event->flag = 0; } /*---------------------------------------------------------------------------* Name: osClearEvent Description: clear specified event bits Arguments: event : pointer to event struct clearBit : clear bits Returns: none *---------------------------------------------------------------------------*/ void osClearEvent(OSEvent* event, u32 clearBit) { OSIntrMode enable = osDisableInterrupts(); SDK_ASSERT( event ); event->flag &= ~clearBit; (void)osRestoreInterrupts(enable); } /*---------------------------------------------------------------------------* Name: osPollEvent Description: poll event struct if condition matches Arguments: event : waiting condition pattern : event pattern mode : event mode OS_EVENT_MODE_AND ... wait for all event bit OS_EVENT_MODE_OR ... wait for any event bit Returns: not 0 ... matched. return the event flag. 0 ... not match. *---------------------------------------------------------------------------*/ u32 osPollEvent(OSEvent* event, u32 pattern, OSEventMode mode ) { return osPollEventEx( event, pattern, mode, 0 ); } /*---------------------------------------------------------------------------* Name: osPollEventEx Description: poll event struct if condition matches Arguments: event : pointer to event struct pattern : event pattern mode : event mode OS_EVENT_MODE_AND ... wait for all event bit OS_EVENT_MODE_OR ... wait for any event bit clearBit : clear bits (in case of matching) Returns: not 0 ... matched. return the event flag. 0 ... not match. *---------------------------------------------------------------------------*/ u32 osPollEventEx(OSEvent* event, u32 pattern, OSEventMode mode, u32 clearBit ) { u32 retval = 0; OSIntrMode enable = osDisableInterrupts(); SDK_ASSERT( event ); switch( mode ) { case OS_EVENT_MODE_AND: if ( (event->flag & pattern) == pattern ) { retval = event->flag; } break; case OS_EVENT_MODE_OR: if ( event->flag & pattern ) { retval = event->flag; } break; } //---- clear flag if ( retval ) { event->flag &= ~clearBit; } (void)osRestoreInterrupts(enable); return retval; } #if defined(SDK_TCM_APPLY) && defined(SDK_ARM9) #include #endif