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

📄 states.c

📁 telcobridges pri develop,30b+d
💻 C
📖 第 1 页 / 共 5 页
字号:

/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState6:	ISDN processing for call state 'six'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState6)
{
	TBX_RESULT			result = TBX_RESULT_OK;

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_6)
	{
		/* The call is disconnecting -> set a maximum timeout for this state */
		TB640_ISDN_SET_TIMEOUT (TB640_ISDN_CALL_DISCONNECT_MAX_DURATION_SEC);

		/* Take the timestamp */
		in_pCallContext->un32Debug = time(NULL);

		if (in_pCallContext->fWaitForDisconnection != TBX_TRUE)
		{
			/* Disconnect the call */
			in_pCallContext->fIsdnDisconnected = TBX_TRUE;
			TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendDiscRq (in_pCallContext));
		}

		if (in_pCallContext->fCallValid)
		{
			pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_CLOSING;
			g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
		}
		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_CMD_DISCONNECT_REQUEST)
	{
		PTB640_RSP_ISDN_CMD_DISCONNECT_REQUEST		pRsp = (PTB640_RSP_ISDN_CMD_DISCONNECT_REQUEST)in_pMsgPayload;
		if (TBX_RESULT_FAILURE(pRsp->Result))
		{
			/* Case of disconnect collision */
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
		}
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_CONFIRM)
	{
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
	{
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
	{
		TB640_ISDN_LOG (TRACE_LEVEL_4, "Call timeout while waiting for proper ISDN disconnection, trk %d\n", in_pCallContext->un32TrunkIndex);
		TB640_ISDN_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_ISDN_LOG (TRACE_LEVEL_ALWAYS, "%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_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
	}

	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
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState7:	ISDN processing for call state 'seven'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState7)
{
	TBX_RESULT			result = TBX_RESULT_OK;

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_7)
	{
		/* The call is restarting -> set a maximum timeout for this state */
		TB640_ISDN_SET_TIMEOUT (TB640_ISDN_CALL_RESTART_MAX_DURATION_SEC);

		/* The timeslot is now in restarting state */
		if (in_pCallContext->fCallValid)
		{
			pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_RESTARTING;
			g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
		}

		/* Start the restart sequence */
		TB640_ISDN_INCREMENT_STATS (un32NbRestartAttempt, 1);
		in_pCallContext->nRestartCount = 0;
		TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendRestartChannelRq (in_pCallContext));

		TB640_ISDN_STATE_WAIT;
	}


	TB640_ISDN_STATE_DECLARE_FIRST_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_RESTART_ACK)
		{
			if (pEvent->aun8Data[0] == TBX_FALSE)
			{
				TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "%s call 0x%08X restart FAILED\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
				TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X Resetting trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
				  pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);

				TB640_ISDN_INCREMENT_STATS (un32NbResetAttempt, 1);
				g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;

				in_pCallContext->fResetChannelOccured = TBX_TRUE;
				TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendResetChannelRq (in_pCallContext));
				TB640_ISDN_STATE_WAIT;
			}
			else
			{
				TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has successfully restarted\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
				TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_13);
			}
		}
		else
		{
			TB640_ISDN_STATE_WAIT;
		}
	}


	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
	{
		in_pCallContext->fTimeoutOccured = TBX_TRUE;
		TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);

		TB640_ISDN_LOG (TRACE_LEVEL_4, "%s call 0x%08X has received a timeout instead of RESTART_ACK, trk %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32TrunkIndex);
		TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X Resetting trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
		  pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);

		TB640_ISDN_INCREMENT_STATS (un32NbResetAttempt, 1);
		g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;

		in_pCallContext->fResetChannelOccured = TBX_TRUE;
		TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendResetChannelRq (in_pCallContext));
		TB640_ISDN_STATE_WAIT;
	}


	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_CMD_RESET_CHANNEL_REQUEST)
	{
		PTB640_RSP_ISDN_CMD_RESET_CHANNEL_REQUEST		pRsp = (PTB640_RSP_ISDN_CMD_RESET_CHANNEL_REQUEST)in_pMsgPayload;
		if (TBX_RESULT_FAILURE(pRsp->Result))
		{
			TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X FAILURE of reset for trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
			  pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);

			if (in_pCallContext->fCallValid)
			{
				/* Marking timeslot as 'condemned' */
				pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_CONDEMNED;
				g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
			}
		}

		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_13);
	}

	TB640_ISDN_STATE_RETURN
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState8:	ISDN processing for call state 'eight'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState8)
{
	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_8)
	{
		TB640_ISDN_INCREMENT_STATS (un32NbCallClosingTotal, 1);
		if (in_pCallContext->fCallSuccessful)
		{
			TB640_ISDN_INCREMENT_STATS (un32NbCallCompleted, 1);
		}

		if (in_pCallContext->fCallValid)
		{
			if (pTrunkResInfo->Statistics.State != TB640_ISDN_TRUNK_RESOURCE_STATE_CONDEMNED)
			{
				pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_IDLE;
				pTrunkResInfo->Statistics.un32LastIdleTimestamp = TBX_GET_TICK();
			}
			pTrunkResInfo->hCall = (TB640_CALL_HANDLE)NULL;
			g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
		}

		TB640_ISDN_DECREMENT_TRANSIANT_CALL (1);

		if (!in_pCallContext->fCallSuccessful)
		{
			pTrunkInfo->un32NbCallOpeningFailure++;
		}
		if (in_pCallContext->fTimeoutOccured)
		{
			pTrunkInfo->un32NbTimeoutOccured++;
		}

		TB640_ISDN_DESTROY_CONTEXT;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_NOT_USED)
		TB640_ISDN_STATE_CONTINUE;

	TB640_ISDN_STATE_RETURN
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState9:	ISDN processing for call state 'nine'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState9)
{
	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_9)
	{
		pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_OPENING_OUTGOING;
		g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_CMD_CONNECT_REQUEST)
	{
		PTB640_RSP_ISDN_CMD_CONNECT_REQUEST		pReq = (PTB640_RSP_ISDN_CMD_CONNECT_REQUEST)in_pMsgPayload;
		if (TBX_RESULT_SUCCESS(pReq->Result))
		{
			/* Timeslot is now in use */
			in_pCallContext->hCall = pReq->hCall;
			pTrunkResInfo->hCall = in_pCallContext->hCall;

			/* Remove the trailing '#' if we dialed in overlap mode */
			if (in_pCallContext->aun8OutbandCalledAddress [strlen(in_pCallContext->aun8OutbandCalledAddress) - 1] == '#')
			{
				in_pCallContext->aun8OutbandCalledAddress [strlen(in_pCallContext->aun8OutbandCalledAddress) - 1] = 0;
			}

			TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X calling=%s, called=%s, redir=%s\n", in_pCallContext->hCall, in_pCallContext->aun8OutbandCallingAddress, in_pCallContext->aun8OutbandCalledAddress, in_pCallContext->aun8Redirecting);

			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_10);
		}
		else
		{
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Received failure for connection request, 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_8);

		}
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
	{
		TB640_ISDN_LOG (TRACE_LEVEL_4, "Timeout while waiting for connection request, 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_RETURN
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState10:	ISDN processing for call state 'ten'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState10)
{
	TBX_RESULT			result = TBX_RESULT_OK;

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_10)
	{
		/* Nothing to do */
		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_CALL_PROCEEDING_INDICATION)
	{
		PTB640_EVT_ISDN_NOTIF_CALL_PROCEEDING_INDICATION pEvent = (PTB640_EVT_ISDN_NOTIF_CALL_PROCEEDING_INDICATION)in_pMsgPayload;
		if (pEvent->hTrunkRes != pTrunkResInfo->hTrunkResource)
		{
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Unknown trunk resource handle, trk %d\n", in_pCallContext->un32TrunkIndex);
			TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
		}
		else
		{
			TB640_ISDN_STATE_WAIT;
		}
	}

	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 ALERT or CONN_CFM, 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_8);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_ALERT_INDICATION)
	{
		if (in_pCallContext->fIsdnNeedToDisconnect == TBX_FALSE)
		{
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_11);
		}
		else
		{
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Received request for disconnection before getting ALERT, 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_NOTIF_CONNECT_CONFIRM)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -