📄 headset_statemanager.c
字号:
/****************************************************************************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 + -