📄 states.c
字号:
/* If there was a connection, let's disconnect */
if (in_pCallContext->fConnected == TBX_TRUE)
{
pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_DISCONNECTING;
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
TB640CasSendDestroyConnection (in_pCallContext->hConnection, in_pCallContext);
TB640_CAS_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_CAS_STATE_WAIT;
}
else
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_FIVE);
}
}
TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CAS_NOTIF_DISCONNECT_INDICATION)
{
in_pCallContext->fCasDisconnected = TBX_TRUE;
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_DECLARE_NEXT_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_CAS_LOG (TRACE_LEVEL_2, "%s call 0x%08X has closed connection 0x%08X successfully\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->hConnection);
in_pCallContext->fConnected = TBX_FALSE;
}
else
{
TB640_CAS_LOG (TRACE_LEVEL_3, "%s call 0x%08X has NOT closed connection 0x%08X\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->hConnection);
in_pCallContext->fCallSuccessful = TBX_FALSE;
}
/* One less response to receive */
in_pCallContext->hConnection = (TB640_CONNECTION_HANDLE)NULL;
pTrunkResInfo->hConnection = (TB640_CONNECTION_HANDLE)NULL;
in_pCallContext->nDestroyRspExpected--;
/* Wait until all response are received */
if (in_pCallContext->nCreateRspExpected > 0)
{
TB640_CAS_STATE_WAIT;
}
/* Do we need to force a restart ? */
if (in_pCallContext->fNeedToRestart != TBX_FALSE)
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_EIGHT);
}
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_FIVE);
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_RESTART)
{
in_pCallContext->fNeedToRestart = TBX_TRUE;
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_TIMEOUT)
{
TB640_CAS_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_CAS_INCREMENT_TRUNK_STATS (un32NbTimeoutOccured, 1);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fCasNeedToDisconnect = TBX_TRUE;
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640CasProcessStateFive: CAS processing for call state 'five'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateFive)
{
TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_FIVE)
{
if (in_pCallContext->fCasDisconnected == TBX_TRUE)
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ELEVEN);
}
else
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
}
}
TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_NOT_USED)
{
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640CasProcessStateSix: CAS processing for call state 'six'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateSix)
{
TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_SIX)
{
TB640_CAS_LOG (TRACE_LEVEL_3, "%s call 0x%08X has reached an no-longer-supported state\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
}
TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_NOT_USED)
{
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640CasProcessStateSeven: CAS processing for call state 'seven'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateSeven)
{
TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_SEVEN)
{
/* The call is disconnecting -> set a maximum timeout for this state */
TB640_CAS_SET_TIMEOUT (TB640_CAS_CALL_DISCONNECT_MAX_DURATION_SEC);
/* Take the timestamp */
in_pCallContext->un32Debug = time(NULL);
/* Disconnect the call */
in_pCallContext->fCasDisconnected = TBX_TRUE;
TB640CasSendDiscRq (in_pCallContext);
pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_CLOSING;
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CAS_CMD_DISCONNECT_REQUEST)
{
PTB640_RSP_CAS_CMD_DISCONNECT_REQUEST pRsp = (PTB640_RSP_CAS_CMD_DISCONNECT_REQUEST)in_pMsgPayload;
if (TBX_RESULT_FAILURE(pRsp->Result))
{
/* Case of disconnect collision */
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ELEVEN);
}
else
{
TB640_CAS_STATE_WAIT;
}
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_NOTIF_DISCONNECT_CONFIRM)
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ELEVEN);
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_NOTIF_DISCONNECT_INDICATION)
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ELEVEN);
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_TIMEOUT)
{
TB640_CAS_LOG (TRACE_LEVEL_3, "%s call 0x%08X is no longer responding.. Restarting trunk %d, timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
TB640_CAS_LOG (TRACE_LEVEL_0, "%s call 0x%08X origtime=%d, nowtime=%d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32Debug, time(NULL));
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fCallSuccessful = TBX_FALSE;
TB640_CAS_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_CAS_INCREMENT_TRUNK_STATS (un32NbTimeoutOccured, 1);
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_EIGHT);
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_RESTART)
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_EIGHT);
}
TB640_CAS_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640CasProcessStateEight: CAS processing for call state 'eight'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateEight)
{
TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_EIGHT)
{
/* The call is restarting -> set a maximum timeout for this state */
TB640_CAS_SET_TIMEOUT (TB640_CAS_CALL_RESTART_MAX_DURATION_SEC);
/* The timeslot is now in restarting state */
pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_RESTARTING;
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
/* Start the restart sequence */
TB640_CAS_INCREMENT_STATS (un32NbRestartAttempt, 1);
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
in_pCallContext->nRestartCount = 0;
TB640CasSendRestartChannelRq (in_pCallContext);
TB640_CAS_STATE_WAIT;
}
TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CAS_NOTIF_STATUS_INDICATION)
{
PTB640_EVT_CAS_NOTIF_STATUS_INDICATION pEvent = (PTB640_EVT_CAS_NOTIF_STATUS_INDICATION)in_pMsgPayload;
if (pEvent->StatusIndication == TB640_CAS_STATUS_IND_VALUE_RESTART_ACK)
{
TB640_CAS_LOG (TRACE_LEVEL_0, "%s call 0x%08X restart status = %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, pEvent->aun8Data[0]);
if (pEvent->aun8Data[0] == TBX_FALSE)
{
if (in_pCallContext->nRestartCount < 2)
{
/* The call is restarting -> set a maximum timeout for this state */
TB640_CAS_SET_TIMEOUT (TB640_CAS_CALL_RESTART_MAX_DURATION_SEC);
TB640_CAS_INCREMENT_STATS (un32NbRestartAttempt, 1);
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
in_pCallContext->nRestartCount++;
TB640CasSendRestartChannelRq (in_pCallContext);
TB640_CAS_STATE_WAIT;
}
else
{
/* Condemn the timeslot */
TB640_CAS_LOG (TRACE_LEVEL_3, "%s call 0x%08X is no longer responding (too many restart attempt).. Condemning trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);
pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_CONDEMNED;
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_NINE);
}
}
else
{
TB640_CAS_LOG (TRACE_LEVEL_2, "%s call 0x%08X has successfully restarted\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_NINE);
}
}
else
{
TB640_CAS_STATE_WAIT;
}
}
TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_TIMEOUT)
{
in_pCallContext->fTimeoutOccured = TBX_TRUE;
TB640_CAS_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_CAS_INCREMENT_TRUNK_STATS (un32NbTimeoutOccured, 1);
TB640_CAS_LOG (TRACE_LEVEL_3, "%s call 0x%08X has received a timeout instead of RESTART_ACK\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
/* Check if we exhausted our restart trials */
if (in_pCallContext->nRestartCount < 2)
{
/* The call is restarting -> set a maximum timeout for this state */
TB640_CAS_SET_TIMEOUT (TB640_CAS_CALL_RESTART_MAX_DURATION_SEC);
TB640_CAS_INCREMENT_STATS (un32NbRestartAttempt, 1);
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
in_pCallContext->nRestartCount++;
TB640CasSendRestartChannelRq (in_pCallContext);
TB640_CAS_STATE_WAIT;
}
else
{
/* Condemn the timeslot */
TB640_CAS_LOG (TRACE_LEVEL_3, "%s call 0x%08X is no longer responding (too many restart/reset attempt).. Condemning trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);
pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_CONDEMNED;
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_NINE);
}
}
TB640_CAS_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640CasProcessStateNine: CAS processing for call state 'nine'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateNine)
{
TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_NINE)
{
in_pCallContext->nDestroyRspExpected = 0;
/* The call is disconnecting -> set a maximum timeout */
TB640_CAS_SET_TIMEOUT (TB640_CAS_CALL_DISCONNECT_MAX_DURATION_SEC);
/* If there was a connection, let's disconnect */
if (in_pCallContext->fConnected == TBX_TRUE)
{
g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
TB640CasSendDestroyConnection (in_pCallContext->hConnection, in_pCallContext);
TB640_CAS_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_CAS_STATE_WAIT;
}
else
{
TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_TEN);
}
}
TB640_CAS_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))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -