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