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

📄 states.c

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

	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;
		}
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CONN_OP_CREATE)
	{
		PTB640_RSP_CONN_OP_CREATE		pRsp = (PTB640_RSP_CONN_OP_CREATE)in_pMsgPayload;

		/* One less response to obtain */
		in_pCallContext->nCreateRspExpected--;

		/* Was the connection 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, "Incoming call 0x%08X connected with handle 0x%08X\n", in_pCallContext->hCall, in_pCallContext->hConnection);

			/* Force a restart ? */
			if (in_pCallContext->fNeedToRestart != TBX_FALSE)
			{
				TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
			}
		}
		else
		{
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Incoming call 0x%08X had an error while connecting resources, trk %d\n", in_pCallContext->hCall, in_pCallContext->un32TrunkIndex);
			TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);

			/* Force a restart ? */
			if (in_pCallContext->fNeedToRestart != TBX_FALSE)
			{
				TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
			}
			else
			{
				TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_5);
			}
		}

		/* Were we disconnected on our ISDN channel */
		if ((in_pCallContext->fIsdnDisconnected == TBX_TRUE) || (in_pCallContext->fIsdnNeedToDisconnect == TBX_TRUE))
		{
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Call disconnected while waiting for res. connection, trk %d\n", in_pCallContext->un32TrunkIndex);
			TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
		}

		/* Send the connection response ! */
		TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendConnRspRq (in_pCallContext));

		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_3);
	}

	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)
	{
		in_pCallContext->fTimeoutOccured = TBX_TRUE;
		in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
		TB640_ISDN_LOG (TRACE_LEVEL_4, "Call timeout while waiting for connection response, trk %d\n", in_pCallContext->un32TrunkIndex);
		TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_RETURN
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState3:	ISDN processing for call state 'three'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState3)
{
	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_3)
	{
		TBX_UINT32		un32CallDuration;

		pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_ACTIVE;
		g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;

		TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningSuccess, 1);
		in_pCallContext->fCallSuccessful = TBX_TRUE;

		/* Do we need to do a random call duration */
		if (in_pCallContext->un32MinCallDuration == in_pCallContext->un32MaxCallDuration)
		{
			if (in_pCallContext->un32MinCallDuration == (TBX_UINT32)-1)
			{
				TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has an infinite call duration\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
			}
			else
			{
				TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has a %d second call duration\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32MinCallDuration);
			}

			/* Fixed call duration */
			un32CallDuration = in_pCallContext->un32MinCallDuration;
		}
		else
		{
			TBX_UINT32		un32Possibility;

			/* Random call generation */
			un32CallDuration = (in_pCallContext->un32MaxCallDuration - in_pCallContext->un32MinCallDuration) + 1;

			/* Give a number between 0 and 999 */
			un32Possibility = (rand() * 1000) / RAND_MAX;
			if (un32Possibility == 1000)
			{
				un32Possibility = 999;
			}
			un32CallDuration = un32Possibility / (1000 / un32CallDuration);
			un32CallDuration += in_pCallContext->un32MinCallDuration;

			TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has a %d second call duration (random)\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, un32CallDuration);
		}

		/* Set the timeout on the call */
		if (un32CallDuration > 0)
		{
			/* Call duration of x second on the call */
			TB640_ISDN_SET_TIMEOUT (un32CallDuration);
		}
		else
		{
			/* Call needs to be disconnected immediately */
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
		}

		TB640_ISDN_DECREMENT_TRANSIANT_CALL (1);

		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
	{
		TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);

		in_pCallContext->fIsdnDisconnected = TBX_TRUE;
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
	}

	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_INCREMENT_TRANSIANT_CALL (1);

			in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;

			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
		}
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_DROP_CALL)
	{
		TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);

		/* The user wants to drop a call */
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
	{
		TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);

		in_pCallContext->fTimeoutOccured = TBX_TRUE;
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
	{
		TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
	}

	TB640_ISDN_STATE_RETURN
}


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

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_4)
	{
		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)
		{
			if (in_pCallContext->fCallValid)
			{
				pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_DISCONNECTING;
				g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
			}

			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_5);
		}
	}

	TB640_ISDN_STATE_DECLARE_FIRST_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_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_pCallContext->hConnection);
			in_pCallContext->fConnected = TBX_FALSE;
		}
		else
		{
			TB640_ISDN_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;
		if (in_pCallContext->fCallValid)
		{
			pTrunkResInfo->hConnection = (TB640_CONNECTION_HANDLE)NULL;
		}
		in_pCallContext->nDestroyRspExpected--;

		/* 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);
		}

		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_5);
	}

	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, "Call timeout while waiting for disconnection response, 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
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640IsdnProcessState5:	ISDN processing for call state 'five'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState5)
{
	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_5)
	{
		if (in_pCallContext->fIsdnDisconnected == TBX_TRUE)
		{
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
		}
		else
		{
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
		}
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_NOT_USED)
	{
		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_RETURN
}

⌨️ 快捷键说明

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