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

📄 headset_statemanager.c

📁 蓝牙耳机的源代码,结合csr的开发套件使用
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************Copyright (C) Cambridge Silicon Radio Ltd. 2004-2006Part of BlueLab 3.5.2-releaseFILE NAME    headset_statemanager.h    DESCRIPTION    state machine helper functions used for state changes etc - provide single     state change points etc for the headset app*/#include "headset_statemanager.h"#include "headset_LEDmanager.h"#include "headset_soundmanager.h"#include "headset_buttonmanager.h"#include "headset_dut.h"#include "headset_scan.h"#include "headset_slc.h"#ifdef DEBUG_STATES#define SM_DEBUG(x) DEBUG(x)const char * const gHSStateStrings [ 12 ] = {                               "headsetLimbo",                               "headsetConnectable",                               "headsetConnDiscoverable",                               "headsetConnected",                               "headsetOutgoingCallEstablish",                               "headsetIncomingCallEstablish",                               "headsetActiveCall",                               "headsetTESTMODE",                               "headsetThreeWayCallWaiting",                               "headsetThreeWayCallOnHold",                               "headsetThreeWayMulticall",                               "headsetIncomingCallOnHold"} ;                               #else#define SM_DEBUG(x) #endif#define SM_LIMBO_TIMEOUT_SECS 5/****************************************************************************VARIABLES*/    /*the headset state variable - accessed only from below fns*/static headsetState gTheHeadsetState ;static bool  gSMAutoEnterDiscoverableState = FALSE ;#define CM_HEADSET_PAIR_INDEFINETELY 0xFFFFstatic uint16 gPairModeTimeoutTime_s = CM_HEADSET_PAIR_INDEFINETELY ;static void stateManagerResetPIOs ( hsTaskData * pApp ) ;/****************************************************************************FUNCTIONS*/static void stateManagerSetState ( hsTaskData * pApp , headsetState pNewState ) ;/****************************************************************************NAME		stateManagerSetStateDESCRIPTION	helper function to Set the current headset state    provides a single state change point and passes the information    on to the managers requiring state based responses    RETURNS	    */static void stateManagerSetState ( hsTaskData * pApp , headsetState pNewState ){    SM_DEBUG(("SM: Ch[%s]->[%s] [%d]\n",gHSStateStrings[stateManagerGetState()] , gHSStateStrings[pNewState] , pNewState ));        if ( pNewState < HEADSET_NUM_STATES )    {        if (pNewState != gTheHeadsetState )        {                /*inform the LED manager of the current state to be displayed*/            LEDManagerIndicateState ( &pApp->theLEDTask , pNewState ) ;        }        else        {            /*we are already indicating this state no need to re*/        }           gTheHeadsetState = pNewState ;       }    else    {        SM_DEBUG(("SM: ? [%s] [%x]\n",gHSStateStrings[ pNewState] , pNewState)) ;    }            /*if we are in chargererror then reset the leds and reset the error*/    if (pApp->power->charger.state == charge_error )    {           /* Cancel current LED indication */	   MessageSend(getAppTask(), EventCancelLedIndication, 0);		       /* Indicate charger error */	   MessageSend(getAppTask(), EventChargeError, 0);    }}/****************************************************************************NAME		stateManagerGetStateDESCRIPTION	helper function to get the current headset stateRETURNS	the Headset State information    */headsetState stateManagerGetState ( void ){    headsetState lHeadsetState = gTheHeadsetState ;    return lHeadsetState ;}/****************************************************************************NAME		stateManagerConfigureConnDiscoStateDESCRIPTION	function to configure the connectableDiscoverable state action    if pAutoEnterPairMode == TRUE, then the device enters connectable /     Discoverable mode automatically after power on. In this case, the timeout is not     used. Otherwise, the device will only enter D/C mode after a user event. in this case, it will    enter D/C mode for the timout (ms) specifiedRETURNS	void    */void stateManagerConfigureConnDiscoState ( uint16 pPairModeTimeout_s , bool pAutoEnterPairMode) {    /*it is only logical for the pair mode to be auto entering with no timeout*/    if (pAutoEnterPairMode )    {             gSMAutoEnterDiscoverableState = TRUE ;        gPairModeTimeoutTime_s       = CM_HEADSET_PAIR_INDEFINETELY ;    }    else    {        gSMAutoEnterDiscoverableState = FALSE ;        gPairModeTimeoutTime_s       = pPairModeTimeout_s ;    }}/****************************************************************************NAME		stateManagerEnterConnectableStateDESCRIPTION	single point of entry for the connectable state - enters discoverable state     if configured to do soRETURNS	void    */void stateManagerEnterConnectableState ( hsTaskData *pApp, bool req_disc ){    if ( stateManagerIsConnected() && req_disc == TRUE)    {            /*then we have an SLC active*/       headsetDisconnectSlc( pApp );    }          /*determine if we have got here after a DiscoverableTimeoutEvent*/    if ( stateManagerGetState() == headsetConnDiscoverable )    {        SM_DEBUG(("SM : det PFail\n")) ;                    /*disable the discoverable mode*/        if (!pApp->features.RemainDiscoverableAtAllTimes)        {            headsetDisableDiscoverable ( pApp) ;        }        MessageCancelAll ( &pApp->task , EventPairingFail ) ;    }        /* Make the headset connectable */    headsetEnableConnectable(pApp);    stateManagerSetState ( pApp ,headsetConnectable ) ;            /*disable the ring PIOs if enabled*/    stateManagerResetPIOs ( pApp ) ;        if ( gSMAutoEnterDiscoverableState == TRUE )    {            stateManagerEnterConnDiscoverableState( pApp ) ;    }  }/****************************************************************************NAME		stateManagerEnterConnDiscoverableState|DESCRIPTION	single point of entry for the connectable / discoverable state     uses timeout if configuredRETURNS	void    */void stateManagerEnterConnDiscoverableState ( hsTaskData *pApp ){    if ( stateManagerIsConnected() )    {            /*then we have an SLC active*/       headsetDisconnectSlc( pApp );    }      if ( stateManagerGetState() != headsetConnectable)    {        SM_DEBUG(("SM : ?St CD\n")) ;    }      /* Make the headset connectable */    headsetEnableConnectable(pApp);    /* Make the headset discoverable */      headsetEnableDiscoverable(pApp);            /* If there is a timeout - send a user message*/    if (gPairModeTimeoutTime_s != CM_HEADSET_PAIR_INDEFINETELY )    {        SM_DEBUG(("SM : Pair [%x]\n" , gPairModeTimeoutTime_s )) ;                MessageSendLater ( &pApp->task , EventPairingFail , 0 , D_SEC(gPairModeTimeoutTime_s) ) ;    }    else    {        SM_DEBUG(("SM : Pair Indefinetely\n")) ;    }    /* Disable the ring PIOs if enabled*/    stateManagerResetPIOs ( pApp ) ;   	/* The headset is now in the connectable/discoverable state */    stateManagerSetState (pApp , headsetConnDiscoverable ) ;}/****************************************************************************NAME		stateManagerEnterConnectedStateDESCRIPTION	single point of entry for the connected state - disables disco / connectable modesRETURNS	void    */void stateManagerEnterConnectedState ( hsTaskData *pApp ){    if (stateManagerGetState () != headsetConnected )    {            /*make sure we are now neither connectable or discoverable*/        SM_DEBUG(("SM:Remain in Disco Mode [%c]\n", (pApp->features.RemainDiscoverableAtAllTimes?'T':'F') )) ;                if (!pApp->features.RemainDiscoverableAtAllTimes)        {            headsetDisableDiscoverable ( pApp ) ;            }        headsetDisableConnectable  ( pApp ) ;                    switch ( stateManagerGetState() )        {                case headsetActiveCall:            case headsetThreeWayCallWaiting:            case headsetThreeWayCallOnHold:            case headsetThreeWayMulticall:            case headsetOutgoingCallEstablish:            case headsetIncomingCallEstablish:                    /*then we have just ended a call*/                MessageSend ( &pApp->task , EventEndOfCall , 0 ) ;            break ;            default:            break ;        }                /*send the request for the hold information*/        if ( pApp->HFP_1_5_supp_features.HFP_1_5_Is_Enabled )        {            HfpGetResponseHoldStatus(pApp->hfp) ;            HfpGetCurrentCalls ( pApp->hfp) ;        }        MessageCancelAll ( &pApp->task , EventPairingFail ) ;                    /*disable the ring PIOs if enabled*/        stateManagerResetPIOs ( pApp ) ;            stateManagerSetState ( pApp , headsetConnected ) ;   }     }/****************************************************************************NAME		stateManagerEnterIncomingCallEstablishStateDESCRIPTION

⌨️ 快捷键说明

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