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

📄 states.c

📁 telcobridges cas develop
💻 C
📖 第 1 页 / 共 5 页
字号:
		/* 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 + -