⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 headset_ledmanager.c

📁 bluelab的一个很好的例程
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004

FILE NAME
    headset_LEDmanager.c
    
DESCRIPTION
    Module responsible for managing the PIO outputs including LEDs
    
*/


/****************************************************************************
INCLUDES
*/
#include "headset_LEDmanager.h"
#include "headset_private.h"


#include "headset_configmanager.h"
#include "headset_statemanager.h"
#include "headset_leds.h"
#include "headset_pio.h"

#include <stddef.h>

/****************************************************************************
DEFINITIONS
*/


#ifdef DEBUG_LM
#define LM_DEBUG(x) DEBUG(x)
#else
#define LM_DEBUG(x) 
#endif



/****************************************************************************
VARIABLES - TYPES and GLOBALS
*/


/****************************************************************************
LOCAL FUNCTION PROTOTYPES
*/

 /*internal method to provide a pointer to one of the malloced patterns*/
static LEDPattern_t * LMGetPattern ( LedTaskData * ptheLEDTask )  ;
    /*method to release a pattern - actually clears data held in pattern so it can be used again*/
static void LMResetPattern ( LEDPattern_t * pPattern ) ;

static bool LMIsPatternEmpty (LEDPattern_t * pPattern ) ;

static LEDPattern_t *  LMAddPattern ( LedTaskData * ptheLEDTask , LEDPattern_t * pSourcePattern , LEDPattern_t * pDestPattern ) ;

 /*methods to allocate/ initialise the space for the patterns and mappings*/
static void LEDManagerInitStatePatterns   ( LedTaskData * ptheLEDTask ) ;
static void LEDManagerInitEventPatterns   ( LedTaskData * ptheLEDTask ) ;
static void LEDManagerInitActiveLEDS      ( LedTaskData * ptheLEDTask ) ;
static void LEDManagerCreateFilterPatterns( LedTaskData * ptheLEDTask ) ;

/****************************************************************************
NAME 
 PIOManagerInit

DESCRIPTION
 Initialises LED manager

RETURNS
 void
    
*/
void LEDManagerInit ( LedTaskData * ptheLEDTask ) 
{
    uint16 lIndex = 0 ;
    uint16 lSize = 0;
        
    LM_DEBUG(("LM Init :\n")) ;
   
        /*allocate the space for all of the patterns*/
    ptheLEDTask->gPatterns = mallocPanic ( sizeof (LEDPattern_t) * LM_MAX_NUM_PATTERNS )  ;
    
    for (lIndex = 0 ; lIndex < LM_MAX_NUM_PATTERNS ; lIndex ++ )
    {
            /*make sure the pattern is released and ready for use*/
        LMResetPattern ( &ptheLEDTask->gPatterns[lIndex] )  ;      
    }
    /*malloc the space for all of the other data*/

    lSize =   ( (sizeof(LEDPattern_t *)) * HEADSET_NUM_STATES  )      /*the state pattern pointers*/
            + ( (sizeof(LEDPattern_t *)) * EVENTS_MAX_EVENTS   ) ;     /*the event pattern pointers*/
    
    ptheLEDTask->gStatePatterns = (LEDPattern_t * * ) mallocPanic (lSize) ;
    

        /*the events are placed after the states*/
    ptheLEDTask->gEventPatterns = (LEDPattern_t * *) (ptheLEDTask->gStatePatterns + HEADSET_NUM_STATES) ;
    
        /*malloc the LEDS seperately - for now*/
    lSize = (sizeof (LEDActivity_t )) * HEADSET_NUM_LEDS;     /*the active LEDS*/
    ptheLEDTask->gActiveLEDS = (LEDActivity_t *) mallocPanic(lSize) ;
    
    LM_DEBUG(("LM : p[%x][%x][%x]\n" ,  (int)ptheLEDTask->gStatePatterns ,
                                        (int)ptheLEDTask->gEventPatterns ,
                                        (int)ptheLEDTask->gActiveLEDS    
              )) ;
    /*create the patterns we want to use*/
    LEDManagerInitStatePatterns ( ptheLEDTask) ;
    
    LEDManagerInitActiveLEDS( ptheLEDTask) ;
    
    LEDManagerInitEventPatterns( ptheLEDTask ) ;
    
    ptheLEDTask->Queue.Event1 = 0 ;
    ptheLEDTask->Queue.Event2 = 0 ;
    ptheLEDTask->Queue.Event3 = 0 ;
    ptheLEDTask->Queue.Event4 = 0 ;
    
    
        /*the filter information*/
    LEDManagerCreateFilterPatterns( ptheLEDTask ) ;
    
    LedsInit ( ptheLEDTask ) ;

}
/****************************************************************************
NAME 
 LEDManagerInitActiveLEDS

DESCRIPTION
 Creates the active LED space for the number of leds the system supports

RETURNS
 void
    
*/
static void LEDManagerInitActiveLEDS ( LedTaskData * ptheLEDTask ) 
{
    uint16 lIndex = 0; 
 
    for ( lIndex= 0 ; lIndex < HEADSET_NUM_LEDS ; lIndex ++ )
    {
        LedsSetLedActivity ( &ptheLEDTask->gActiveLEDS [ lIndex ] , IT_Undefined , 0 ) ;    
    }
}
/****************************************************************************
NAME 
 LEDManagerInitStatePatterns

DESCRIPTION
 Creates the state patterns space for the system states

RETURNS
 void
    
*/
static void LEDManagerInitStatePatterns ( LedTaskData * ptheLEDTask ) 
{
    uint16 lIndex = 0; 
 
    for ( lIndex= 0 ; lIndex < HEADSET_NUM_STATES ; lIndex ++ )
    {
        ptheLEDTask->gStatePatterns [ lIndex ] = NULL ;     
    }
}
/****************************************************************************
NAME 
 LEDManagerInitEventPatterns

DESCRIPTION
 inits the Event pattern pointers

RETURNS
 void
    
*/
static void LEDManagerInitEventPatterns ( LedTaskData * ptheLEDTask )
{
    uint16 lIndex = 0; 
 
    for ( lIndex= 0 ; lIndex < EVENTS_MAX_EVENTS ; lIndex ++ )
    {
       ptheLEDTask->gEventPatterns [ lIndex ] = NULL ;     
    } 
}
/****************************************************************************
NAME 
 LEDManagerCreateFilterPatterns

DESCRIPTION
 Creates the Filter patterns space 

RETURNS
 void
    
*/
static void LEDManagerCreateFilterPatterns ( LedTaskData * ptheLEDTask )
{
    uint16 lIndex = 0 ;
    /*create the space for the filter patterns*/
    
    ptheLEDTask->gEventFilters = (LEDFilter_t *) mallocPanic ( sizeof (LEDFilter_t ) * LM_NUM_FILTER_EVENTS ) ;
    
    for (lIndex = 0 ; lIndex < LM_NUM_FILTER_EVENTS ; lIndex++ )
    {
        ptheLEDTask->gEventFilters [ lIndex ].Event             = 0 ;
        ptheLEDTask->gEventFilters [ lIndex ].IsFilterActive    = FALSE ;      
        ptheLEDTask->gEventFilters [ lIndex ].Speed             = 0 ;
        ptheLEDTask->gEventFilters [ lIndex ].SpeedAction       = SPEED_MULTIPLY ;
        ptheLEDTask->gEventFilters [ lIndex ].Colour            = LED_COL_EITHER ;  
        ptheLEDTask->gEventFilters [ lIndex ].OverideLED        = 0 ;  
        ptheLEDTask->gEventFilters [ lIndex ].FilterToCancel    = 0 ;
        ptheLEDTask->gEventFilters [ lIndex ].OverideLEDActive  = FALSE ;
        ptheLEDTask->gEventFilters [ lIndex ].FollowerLEDActive = FALSE ;
        ptheLEDTask->gEventFilters [ lIndex ].FollowerLEDDelay  = 0 ;
        
    }
    
    ptheLEDTask->gLMNumFiltersUsed = 0 ;

    ptheLEDTask->gTheActiveFilters = 0x0000 ;
}

/****************************************************************************
NAME 
 LMGetPattern

DESCRIPTION
 method to get a pointer to one of the pre allocated patterns - if there are no patterns left,
    returns NULL

RETURNS
 LedPattern_t *
    
*/
static LEDPattern_t * LMGetPattern ( LedTaskData * ptheLEDTask ) 
{
    LEDPattern_t * lPattern = NULL ;
    
    uint16 lIndex = 0 ;
    
        /*iterate through the patterns looking for one that is unused*/
    for (lIndex = 0 ; lIndex < LM_MAX_NUM_PATTERNS ; lIndex ++ )
    {
        if ( LMIsPatternEmpty ( &ptheLEDTask->gPatterns [ lIndex ] ) )
        {
            /*then this pattern is not used and we can use it*/
            lPattern = &ptheLEDTask->gPatterns [ lIndex ] ;
            LM_DEBUG(("LM : PatFound[%d]\n", lIndex  )) ;
                /*if we have found a free pattern then there is no need to continue looking*/
            return lPattern ;
            
        }        
    }
        /*if we could not find a pattern*/
    if (lPattern == NULL)
    {
        LM_DEBUG(("LM : Pat !\n")) ;
    }
    
    return ( lPattern ) ;
}
/****************************************************************************
NAME 
 LMIsPatternUsed

DESCRIPTION
    helper method to determine if a pattern has been used or not - checks
    whether the pattern contains valid data

RETURNS
 bool IsUsed
    
*/
static bool LMIsPatternEmpty (LEDPattern_t * pPattern )
{
    bool lIsUsed = FALSE ;
    
     if ( pPattern->OnTime == 0 )
     {
        if ( pPattern->OffTime == 0 )
        {
            lIsUsed = TRUE ;
        }
     }
    return lIsUsed ; 
}
 
/****************************************************************************
NAME 
 LMReleasePattern

DESCRIPTION
 method to set apattern to a known state so that it can be used by GetPattern
RETURNS
   
*/
static void LMResetPattern ( LEDPattern_t * pPattern )
{
    pPattern->LED_A      = 0 ;
    pPattern->LED_B      = 0 ;
    pPattern->OnTime     = 0 ;
    pPattern->OffTime    = 0 ;
    pPattern->RepeatTime = 0 ;
    pPattern->NumFlashes = 0 ;
    pPattern->Dimming    = FALSE ;
    pPattern->TimeOut    = 0 ;
    pPattern->Colour     = LED_COL_LED_A ;       
}

/****************************************************************************
NAME 
 LEDManagerAddLEDStatePattern

DESCRIPTION
 Adds a state LED mapping

RETURNS
 void
    
*/

void LEDManagerAddLEDStatePattern ( LedTaskData * ptheLEDTask , headsetState pState , LEDPattern_t* pPattern )
{  
    ptheLEDTask->gStatePatterns [ pState ] = LMAddPattern ( ptheLEDTask , pPattern ,  ptheLEDTask->gStatePatterns [ pState ] )  ;
    LM_DEBUG(("LM: AddState[%x][%x]\n" , pState ,(int) ptheLEDTask->gStatePatterns [ pState ] )) ;
}

/****************************************************************************
NAME 
 LEDManagerAddLEDEventPattern

DESCRIPTION
 Adds an event LED mapping

RETURNS
 void
    
*/
void LEDManagerAddLEDEventPattern ( LedTaskData * ptheLEDTask , headsetEvents_t pEvent , LEDPattern_t* pPattern )
{
    uint16 lIndex = pEvent - EVENTS_EVENT_BASE ;

    ptheLEDTask->gEventPatterns [ lIndex ] = LMAddPattern ( ptheLEDTask , pPattern , ptheLEDTask->gEventPatterns [ lIndex ]  ) ;   
    
    LM_DEBUG(("LM: AddEvent[%x] [%x]\n" , pEvent ,(int)ptheLEDTask->gEventPatterns [ lIndex ])) ;    

}

/****************************************************************************
NAME 
 LMAddPattern

DESCRIPTION
 Adds an LED Mapping (Event / State ) 

RETURNS
 the new destination ptr if there was one allocated
    
*/
static LEDPattern_t * LMAddPattern ( LedTaskData * ptheLEDTask , LEDPattern_t * pSourcePattern , LEDPattern_t * pDestPattern ) 
{
        /*if the pattern we have been passed is empty then we want to make sure there is no pattern present*/
    if ( LMIsPatternEmpty ( pSourcePattern )  )
    {
            /*if a pattern is already defined for this Location*/
        if ( pDestPattern ) 
        {
                /*then delete the pattern*/
            LMResetPattern (  pDestPattern ) ;            
            pDestPattern = NULL ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -