📄 states.c
字号:
if (in_pCallContext->fIsdnNeedToDisconnect == TBX_FALSE)
{
in_pCallContext->fReceivedConnectConfirm = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_11);
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received request for disconnection before getting CONN_CFM, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_DROP_CALL)
{
/* In case the user wants to force call shutdown */
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Timeout while waiting for ALERT or CONN_CFM, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_STATUS_INDICATION)
{
PTB640_EVT_ISDN_NOTIF_STATUS_INDICATION pEvent = (PTB640_EVT_ISDN_NOTIF_STATUS_INDICATION)in_pMsgPayload;
if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_MORE_INFO)
{
if (pTrunkInfo->StackConfiguration.Options & TB640_ISDN_STACK_OPTIONS_OVERLAP_SUPPORT)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_15);
}
else
{
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
}
}
else if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_DISCONNECT_RECEIVED)
{
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
}
else if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_CONNECT_RECEIVED)
{
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendConnectAckRq (in_pCallContext));
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState11: ISDN processing for call state 'eleven'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState11)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_11)
{
if( g_AppContext->fDoConnection )
{
if(g_AppContext->fCTBusConnection == TBX_FALSE)
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X using trunk %d, timeslot %d\n", in_pCallContext->hCall, in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
/* Create the connection */
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendCreateConnection ((TB640_RESOURCE_HANDLE)NULL, pTrunkResInfo->hTrunkResource, in_pCallContext));
in_pCallContext->nCreateRspExpected = 1;
TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X trie to connect trunk resource 0x%08X with itself (loopback)\n", in_pCallContext->hCall, pTrunkResInfo->hTrunkResource);
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X using trunk %d, timeslot %d, CTBUS %d:%d\n", in_pCallContext->hCall, in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex, pCtbusInfo->un8CtbusStream, pCtbusInfo->un8CtbusTimeslot);
/* Create the connection */
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendCreateConnection (pCtbusInfo->hCtbusResource, pTrunkResInfo->hTrunkResource, in_pCallContext));
in_pCallContext->nCreateRspExpected = 1;
TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X trie to connect trunk resource 0x%08X and CtBus resource 0x%08X\n", in_pCallContext->hCall, pTrunkResInfo->hTrunkResource, pCtbusInfo->hCtbusResource);
}
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_CONNECTING;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
TB640_ISDN_STATE_WAIT;
}
else
{
TB640_ISDN_LOG ( TRACE_LEVEL_2, "No connection will be made\n" );
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_12);
}
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CONN_OP_CREATE)
{
PTB640_RSP_CONN_OP_CREATE pRsp = (PTB640_RSP_CONN_OP_CREATE)in_pMsgPayload;
/* Has the connection been successful ? */
if (TBX_RESULT_SUCCESS(pRsp->Result))
{
in_pCallContext->fConnected = TBX_TRUE;
in_pCallContext->hConnection = pRsp->hConn;
pTrunkResInfo->hConnection = pRsp->hConn;
TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X connected with handle 0x%08X\n", in_pCallContext->hCall, in_pCallContext->hConnection);
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_3, "Outgoing call 0x%08X had an error while connecting resources\n", in_pCallContext->hCall);
}
/* One less response to receive */
in_pCallContext->nCreateRspExpected--;
/* Wait until all response are received */
if (in_pCallContext->nCreateRspExpected > 0)
{
TB640_ISDN_STATE_WAIT;
}
/* Do we need to force a restart ? */
if (in_pCallContext->fNeedToRestart != TBX_FALSE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
/* All responses have been received, let's change state */
if (in_pCallContext->fConnected == TBX_FALSE)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received failure during resource connection, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_5);
}
if ((in_pCallContext->fIsdnDisconnected == TBX_TRUE) || (in_pCallContext->fIsdnNeedToDisconnect == TBX_TRUE))
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received disconnection request while waiting for resource connection, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_12);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
{
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_STATUS_INDICATION)
{
PTB640_EVT_ISDN_NOTIF_STATUS_INDICATION pEvent = (PTB640_EVT_ISDN_NOTIF_STATUS_INDICATION)in_pMsgPayload;
if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_DISCONNECT_RECEIVED)
{
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_CONNECT_RECEIVED)
{
in_pCallContext->fReceivedCallConnected = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_CONNECT_CONFIRM)
{
in_pCallContext->fReceivedConnectConfirm = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_DROP_CALL)
{
/* In case the user wants to force call shutdown */
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
in_pCallContext->fNeedToRestart = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Timeout while waiting for resource connection, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState12: ISDN processing for call state 'twelve'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState12)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_12)
{
/* In case we received the connect confirm in the last state (11) */
if (in_pCallContext->fReceivedConnectConfirm == TBX_TRUE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_3);
}
/* In case we received the call connected in the last state (11) */
if (in_pCallContext->fReceivedCallConnected == TBX_TRUE)
{
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendConnectAckRq (in_pCallContext));
}
/* Wait until an event occurs */
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Timeout while waiting for connection confirmation, trk %d\n", in_pCallContext->un32TrunkIndex);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received DISC_IND while waiting for connection confirmation, trk %d\n", in_pCallContext->un32TrunkIndex);
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_CONNECT_CONFIRM)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_3);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_STATUS_INDICATION)
{
PTB640_EVT_ISDN_NOTIF_STATUS_INDICATION pEvent = (PTB640_EVT_ISDN_NOTIF_STATUS_INDICATION)in_pMsgPayload;
if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_DISCONNECT_RECEIVED)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received DISC_IND while waiting for connection confirmation, trk %d\n", in_pCallContext->un32TrunkIndex);
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
if (pEvent->StatusIndication == TB640_ISDN_STATUS_IND_VALUE_CONNECT_RECEIVED)
{
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendConnectAckRq (in_pCallContext));
TB640_ISDN_STATE_WAIT;
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState13: ISDN processing for call state 'thirteen'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState13)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_13)
{
in_pCallContext->nDestroyRspExpected = 0;
/* The call is disconnecting -> set a maximum timeout */
TB640_ISDN_SET_TIMEOUT (TB640_ISDN_CALL_DISCONNECT_MAX_DURATION_SEC);
/* If there was a connection, let's disconnect */
if (in_pCallContext->fConnected == TBX_TRUE)
{
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendDestroyConnection (in_pCallContext->hConnection, in_pCallContext));
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X is closing connection 0x%08X\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->hConnection);
in_pCallContext->nDestroyRspExpected++;
TB640_ISDN_STATE_WAIT;
}
else
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_14);
}
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CONN_OP_DESTROY)
{
PTB640_RSP_CONN_OP_DESTROY pRsp = (PTB640_RSP_CONN_OP_DESTROY)in_pMsgPayload;
if (TBX_RESULT_SUCCESS(pRsp->Result))
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has closed connection 0x%08X successfully\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallCon
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -