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

📄 states.c

📁 基于TB板卡的FSK编程,telcobridges fsk develop
💻 C
📖 第 1 页 / 共 5 页
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |	Project:    	VoiceLink TB640 sample (FSK)
 |
 |	Filename:   	states.c
 |
 |	Copyright:  	TelcoBridges 2002-2003, All Rights Reserved
 |
 |	Description:	This file contains the FSK state machine
 |
 |	Notes:      	Tabs = 4
 |
 *-------------------------------------------------------------------------------------------------------------------------------
 |
 |	Revision:   	$Revision: 1.14 $
 |
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Includes
 *------------------------------------------------------------------------------------------------------------------------------*/

#include "includes.h"

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Forward declarations
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Defines
 *------------------------------------------------------------------------------------------------------------------------------*/

#define TB640_FSK_CALL_DISCONNECT_MAX_DURATION_SEC		15

#define TB640_FSK_CALL_RESTART_MAX_DURATION_SEC			30

#define TB640_FSK_NB_DIGIT_EXPECTED						4


/* Special IDs we are going to use for the state machine as "trigger" events */
#define	TB640_MSG_ID_NOT_USED				TBX_MSG_ID_GEN (0, 0x00)
#define	TB640_MSG_ID_FSK_TIMEOUT			TBX_MSG_ID_GEN (0, 0x01)	/* Timeout on a state */
#define	TB640_MSG_ID_FSK_ACTIVATE_TX		TBX_MSG_ID_GEN (0, 0x02)	/* Activate the timeslot for transmission test */
#define	TB640_MSG_ID_FSK_ACTIVATE_RX		TBX_MSG_ID_GEN (0, 0x03)	/* Activate the timeslot for reception test */
#define	TB640_MSG_ID_FSK_KICK_TX_TEST		TBX_MSG_ID_GEN (0, 0x05)	/* Kick TX test on a timeslot activated for transmission */




/*--------------------------------------------------------------------------------------------------------------------------------
 |  Types
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Versioning
 *------------------------------------------------------------------------------------------------------------------------------*/
#if 0
	/*@unused@*/ static char g_szFileVersion [] = "$Revision: 1.14 $";
#endif


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Global variables
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Macros
 *------------------------------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------------------------------
 |  Function Prototypes
 *------------------------------------------------------------------------------------------------------------------------------*/


TBX_RESULT TB640FskProcessStateChange (
  IN		TBX_ASYNC_LIB_HANDLE		in_hLib,
  IN		PTBX_ASYNC_OP_CONTEXT		in_pOpContext,
  IN		PTB640_FSK_CALL_CONTEXT	in_pCallContext,
  IN		TBX_UINT32					in_un32MsgId,
  IN		PTBX_VOID					in_pMsgPayload);


TBX_VOID
TB640FskResponseMessageHandler(
	IN		PTBX_VOID								in_pvAppContext,
	IN		PTBX_VOID								in_pRequestContext,
	IN		TBX_UINT32								in_un32SearchKey,
	IN		TBX_MSG_ID								in_MsgId,
	IN		PTBX_VOID								in_pvMsgPayload );



TB640_FSK_STATE_FUNCTION(TB640FskProcessStateIdle);
TB640_FSK_STATE_FUNCTION(TB640FskProcessStateRxConfigure);
TB640_FSK_STATE_FUNCTION(TB640FskProcessStateReady);
TB640_FSK_STATE_FUNCTION(TB640FskProcessStateTx);
TB640_FSK_STATE_FUNCTION(TB640FskProcessStateRxGeneric);

TB640_FSK_SERVICE_FUNCTION (TB640FskSendRxConfigure);

TB640_FSK_SERVICE_FUNCTION (TB640FskSendWaitRemote1);
TB640_FSK_SERVICE_FUNCTION (TB640FskSendWaitRemote1Confirm);
TB640_FSK_SERVICE_FUNCTION (TB640FskSendWaitRemote2);
TB640_FSK_SERVICE_FUNCTION (TB640FskSendWaitRemote2Confirm);
TB640_FSK_SERVICE_FUNCTION (TB640FskSendCloseRemote);


TBX_RESULT TB640FskSendTAS
(
  IN	PTB640_FSK_CALL_CONTEXT		in_pCallContext
);

TBX_RESULT TB640FskSendAck
(
  IN	PTB640_FSK_CALL_CONTEXT		in_pCallContext,
  IN	TBX_UINT32					in_un32NbMsgReceived
);


static TBX_VOID TB640FskActivateReceptionInternal (
  IN		TBX_UINT32					in_un32AdapterIdx,
  IN		TBX_UINT32					in_un32TrunkIdx,
  IN		TBX_UINT32					in_un32TimeslotIdx);

static TBX_VOID TB640FskDeactivateInternal (
  IN		TBX_UINT32					in_un32AdapterIdx,
  IN		TBX_UINT32					in_un32TrunkIdx,
  IN		TBX_UINT32					in_un32TimeslotIdx);


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Implementation
 *------------------------------------------------------------------------------------------------------------------------------*/

TBX_VOID	TB640FskUpdateStateTimestamp
(
  IN		PTB640_FSK_CALL_CONTEXT			in_pCallContext,
  IN		TBX_UINT32						in_un32Timestamp
)
{
	PTB640_FSK_ADAPTER_INFO				pAdapterInfo;
	PTB640_FSK_TRUNK_INFO				pTrunkInfo;
	PTB640_FSK_TRUNK_RESOURCE_INFO		pTrunkResInfo;
	PTBX_ASYNC_OP_CONTEXT				pOpContext	= NULL;

	pAdapterInfo	= &(g_AppContext->ahAdapterInfo [in_pCallContext->un32AdapterIndex]);
	pTrunkInfo		= &(pAdapterInfo->aTrunkInfo [in_pCallContext->un32TrunkIndex]);
	pTrunkResInfo	= &(pTrunkInfo->aResourceInfo [in_pCallContext->un32TimeslotIndex]);

	TBXAsyncRetrieveOp
	(
		pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx],
		pTrunkResInfo->hVPResource,
		&pOpContext,
		(PTBX_VOID*)&in_pCallContext
	);
	if( pOpContext )
	{
		TBXAsyncModifyOp
		(
			pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx],
			pOpContext,
			(TBX_UINT32)pTrunkResInfo->hVPResource,
			in_un32Timestamp
		);
	}
}

/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640FskProcessStateIdle:	FSK processing for call state 'idle'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_FSK_STATE_FUNCTION(TB640FskProcessStateIdle)
{
	TB640_FSK_STATE_ENTRY(TB640_FSK_CALL_APP_STATE_IDLE)
	{
		TB640FskUpdateStateTimestamp( in_pCallContext, TB640_FSK_IDLE_TIMEOUT_SEC );
		TB640_FSK_STATE_CONTINUE;
	}

	/* Event: Activate timeslot in transmission. */
	TB640_FSK_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_FSK_ACTIVATE_TX)
	{
		TB640_FSK_TX_ACTION		TxAction;

		in_pCallContext->fReception	= TBX_FALSE;

		/* Send a TAS to remote peer to tell we are switching to "FSK" mode */
/*		TB640FskSendTAS( in_pCallContext );*/

		/* Ask current protocol what should be done upon activating "tx"... */
		TB640FskTransmitDataModeEnter( in_pCallContext, &TxAction );

		switch( TxAction )
		{
			case TB640_FSK_TX_ACTION_SEND:
			{
				/* Immediately send some data */
				TB640_FSK_CHANGE_STATE (TB640_FSK_CALL_APP_STATE_TRANSMITTING);
			} break;

			default:
			{
				/* Bring state machine to next state: TB640_FSK_CALL_APP_STATE_READY */
				TB640_FSK_CHANGE_STATE (TB640_FSK_CALL_APP_STATE_READY);
			} break;
		}
	}

	/* Event: Activate timeslot in reception. */
	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_FSK_ACTIVATE_RX)
	{
		in_pCallContext->fReception	= TBX_TRUE;

		/* Bring state machine to next state: TB640_FSK_CALL_APP_STATE_RX_CONFIGURE */
		TB640_FSK_CHANGE_STATE (TB640_FSK_CALL_APP_STATE_RX_CONFIGURE);
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_VP_FSK_NOTIF_RECEIVE)
	{
		/* Not expecting any FSK data */
/*		TB640_FSK_INCREMENT_STATS( un32NbUnexpectedRx, 1 );*/
		TB640FskActivateReceptionInternal
		(
			in_pCallContext->un32AdapterIndex,
			in_pCallContext->un32TrunkIndex,
			in_pCallContext->un32TimeslotIndex
		);
		pTrunkResInfo->State = TB640_FSK_CALL_APP_STATE_RECEIVE_STATE_GENERIC;

		TB640FskProcessStateChange( in_hLib, in_pOpContext, in_pCallContext, in_un32MsgId, in_pMsgPayload );
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_VP_TONE_NOTIF_DETECTION)
	{
		PTB640_EVT_VP_TONE_NOTIF_DETECTION		pEvtTone = (PTB640_EVT_VP_TONE_NOTIF_DETECTION)in_pMsgPayload;

		if( pEvtTone->Tone.Digit == TB640_VP_DIGIT_TYPE_FSK_TAS )
		{

		}
		else
		{
			/* Not expecting any ack in this state */
			TB640_FSK_INCREMENT_STATS( un32NbUnexpectedAck, 1 );

			TB640_FSK_LOG (TRACE_LEVEL_4, "Received Unexpected Tone from tr:ts %d:%d\n",
			in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
		}
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_VP_TONE_NOTIF_STOP)
	{
		/* Remote peer want us to switch to FSK receive mode. */
		TB640FskActivateReceptionInternal
		(
			in_pCallContext->un32AdapterIndex,
			in_pCallContext->un32TrunkIndex,
			in_pCallContext->un32TimeslotIndex
		);
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_FSK_TIMEOUT)
	{
		/* Reset our timeout */
		TB640FskUpdateStateTimestamp( in_pCallContext, TB640_FSK_IDLE_TIMEOUT_SEC );
	}

	TB640_FSK_STATE_RETURN
}



/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640FskProcessStateRxConfigure:	FSK processing for call state 'Tx configure'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_FSK_STATE_FUNCTION(TB640FskProcessStateRxConfigure)
{
	TB640_FSK_STATE_ENTRY(TB640_FSK_CALL_APP_STATE_RX_CONFIGURE)
	{
		TB640FskUpdateStateTimestamp( in_pCallContext, TB640_FSK_RX_CONFIGURE_TIMEOUT_SEC );

		#ifdef TB640_FSK_USE_INTERHOST_SIMULATION
		{
			/* Immediately continue to "receive generic" state */
			TB640_FSK_CHANGE_STATE (TB640_FSK_CALL_APP_STATE_RECEIVE_STATE_GENERIC);
		}
		#else
		{
			/* Change the timeslot state to "Rx" mode */
			TB640FskSendRxConfigure( in_pCallContext );
		}
		#endif

		TB640_FSK_STATE_CONTINUE;
	}

	/* Event: Activate timeslot in transmission. */
	TB640_FSK_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_VP_FSK_RECEIVE)
	{
		/* Bring state machine to next state: TB640_FSK_CALL_APP_STATE_RECEIVE_STATE_GENERIC */
		TB640_FSK_CHANGE_STATE (TB640_FSK_CALL_APP_STATE_RECEIVE_STATE_GENERIC);
	}

	/* Event: Activate timeslot in transmission. */
	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_FSK_ACTIVATE_RX)
	{
		/* Bring state machine to next state: TB640_FSK_CALL_APP_STATE_RECEIVE_STATE_GENERIC */
		TB640_FSK_CHANGE_STATE (TB640_FSK_CALL_APP_STATE_RECEIVE_STATE_GENERIC);
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_VP_FSK_NOTIF_RECEIVE)
	{
		PTB640_EVT_VP_FSK_NOTIF_RECEIVE	pEventRxData = (PTB640_EVT_VP_FSK_NOTIF_RECEIVE)in_pMsgPayload;

		if( pEventRxData->FskMsg.Gr30.un8MsgType == g_AppContext->CloseRemoteMsgId )
		{
			/* Deactivate current timeslot, as requested by remote peer */
			TB640FskDeactivateInternal
			(
				in_pCallContext->un32AdapterIndex,
				in_pCallContext->un32TrunkIndex,
				in_pCallContext->un32TimeslotIndex
			);
		}
		else
		{
			/* Not expecting any FSK data */
			TB640_FSK_INCREMENT_STATS( un32NbUnexpectedRx, 1 );

			TB640_FSK_LOG (TRACE_LEVEL_4, "Received Unexpected Fsk from tr:ts %d:%d\n",
			in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
		}
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_VP_TONE_NOTIF_DETECTION)
	{
		/* Not expecting this ack in this state */
		TB640_FSK_INCREMENT_STATS( un32NbUnexpectedAck, 1 );

		TB640_FSK_LOG (TRACE_LEVEL_4, "Received Unexpected Tone from tr:ts %d:%d\n",
		in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
	}

	TB640_FSK_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_FSK_TIMEOUT)
	{
		/* Deactivate current timeslot, because it could not be set to Rx mode */
		TB640FskDeactivateInternal
		(
			in_pCallContext->un32AdapterIndex,
			in_pCallContext->un32TrunkIndex,
			in_pCallContext->un32TimeslotIndex
		);
	}

	TB640_FSK_STATE_RETURN
}



/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640FskProcessStateReady:	FSK processing for call state 'Ready'

⌨️ 快捷键说明

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