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

📄 states.c

📁 telcobridges pri develop,30b+d
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -