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

📄 states.c

📁 telcobridges pri develop,30b+d
💻 C
📖 第 1 页 / 共 5 页
字号:
TBX_VOID TB640IsdnFreeCtBusResource (
  IN		TBX_UINT32					in_un32AdapterIdx,
  IN		TBX_UINT8					in_un8Stream,
  IN		TBX_UINT8					in_un8Timeslot);

TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessStateIdle);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState1);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState2);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState3);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState4);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState5);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState6);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState7);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState8);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState9);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState10);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState11);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState12);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState13);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState14);
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState15);

TB640_ISDN_SERVICE_FUNCTION(TB640IsdnSendConnRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendConnRspRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendMoreInfoRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendConnectAckRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendDiscRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendAlertRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendRestartChannelRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendCallProceedingRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendProgressRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendResetChannelRq);
TB640_ISDN_SERVICE_FUNCTION (TB640IsdnSendKeypad);


TBX_RESULT TB640IsdnSendCreateConnection (
  IN		TB640_RESOURCE_HANDLE		in_hCtBusResource,
  IN		TB640_RESOURCE_HANDLE		in_hTrunkResource,
  IN		PTB640_ISDN_CALL_CONTEXT	in_pCallContext);

TBX_RESULT TB640IsdnSendDestroyConnection (
  IN		TB640_CONNECTION_HANDLE		in_hConnection,
  IN		PTB640_ISDN_CALL_CONTEXT	in_pCallContext);

TBX_RESULT TB640IsdnSendWakeUp (
  IN		TBX_UINT32					in_un32AdapterIdx,
  IN		TBX_UINT32					in_un32TrunkIdx);


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Implementation
 *------------------------------------------------------------------------------------------------------------------------------*/


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

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_IDLE)
	{
		TB640_ISDN_STATE_CONTINUE;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_MAKE_CALL)
	{
		TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);

		/* Check if timeslot is free */
		if ((pTrunkResInfo->Statistics.State != TB640_ISDN_TRUNK_RESOURCE_STATE_IDLE) ||
			(pTrunkResInfo->hCall != (TB640_CALL_HANDLE)NULL))
		{
			/* Call collision case occured on the same timeslot */
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Call collision case #1 (timeslot not idle when doign outgoing call), trk %d\n", in_pCallContext->un32TrunkIndex);

			TB640_ISDN_INCREMENT_STATS (un32NbOutgoingCallCollision, 1);
			g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
		}

		in_pCallContext->fCallValid = TBX_TRUE;
		in_pCallContext->fCallOriginator = TBX_TRUE;
		TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendConnRq (in_pCallContext));
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_9);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_CONNECT_INDICATION)
	TB640_ISDN_STATE_DECLARE_EQUIV_EVENT (TB640_MSG_ID_ISDN_NOTIF_CALL_PRESENT_INDICATION)
	TB640_ISDN_STATE_DECLARE_EQUIV_EVENT (TB640_MSG_ID_ISDN_NOTIF_INCOMING_CALL_WITH_RAW_DATA)
	{
		PTB640_EVT_ISDN_NOTIF_CONNECT_INDICATION	pEvent = (PTB640_EVT_ISDN_NOTIF_CONNECT_INDICATION)in_pMsgPayload;

		TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);

		/* Make sure the trunk resource corresponds to our internal structure */
		if (pTrunkResInfo->hTrunkResource != pEvent->hTrunkRes)
		{
			TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "Detected non-matching hTrunkRes during incoming call (got 0x%08X, expecting 0x%08X)\n", pEvent->hTrunkRes, pTrunkResInfo->hTrunkResource);
		}

		/* Spurious calls are not real calls (only used for CDR information).  Let's destroy it */
		if (pEvent->Flags & TB640_ISDN_CALL_FLAGS_SPURIOUS_CALL)
		{
			TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming REFUSED call 0x%08X using trunk %d, timeslot %d\n", in_pCallContext->hCall, in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
			TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming REFUSED call 0x%08X calling=%s, called=%s, redir=%s=%s\n", in_pCallContext->hCall, &(in_pCallContext->aun8OutbandCallingAddress[0]), &(in_pCallContext->aun8OutbandCalledAddress[0]), &(in_pCallContext->aun8Redirecting[0]));
			in_pCallContext->fCallValid = TBX_FALSE;
			in_pCallContext->fWaitForDisconnection = TBX_TRUE;
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
		}

		/* Check if timeslot is free */
		if ((pTrunkResInfo->Statistics.State != TB640_ISDN_TRUNK_RESOURCE_STATE_IDLE) ||
			(pTrunkResInfo->hCall != (TB640_CALL_HANDLE)NULL))
		{
			TB640_ISDN_LOG (TRACE_LEVEL_4, "Call collision case #2 (timeslot not idle when receiving incoming call), trk %d\n", in_pCallContext->un32TrunkIndex);
			TB640_ISDN_INCREMENT_STATS (un32NbIncomingCallCollision, 1);
			g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
		}

		/* Timeslot is now in use */
		in_pCallContext->fCallValid = TBX_TRUE;
		pTrunkResInfo->hCall = in_pCallContext->hCall;
		pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_OPENING_INCOMING;
		g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;

		/* In non-overlap mode, we can answer right away */
		if (!(pTrunkInfo->StackConfiguration.Options & TB640_ISDN_STACK_OPTIONS_OVERLAP_SUPPORT))
		{
			TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_2);
		}

		if (!g_AppContext->fAnswerCallsManually)
		{
			/* In overlap mode, we must check if the received number is complete (excluding the numbering plan) */
			if (pEvent->un32OutbandCalledAddressSize > (TBX_UINT32)(in_pCallContext->nNbExpectedDigit + 1))
			{
				/* Call accepted right away */
				TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_2);
			}
		}

		/* Missing number information */
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_1);
	}

	TB640_ISDN_STATE_RETURN
}


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

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_1)
	{
		TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendMoreInfoRq(in_pCallContext));
		TB640_ISDN_STATE_WAIT;
	}

	TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
	{
		TB640_ISDN_LOG (TRACE_LEVEL_4, "Received DISC_IND while waiting for digit information, trk=%d\n", in_pCallContext->un32TrunkIndex);
		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_KEYPAD_INDICATION)
	{
		PTB640_EVT_ISDN_NOTIF_KEYPAD_INDICATION		pEvent = (PTB640_EVT_ISDN_NOTIF_KEYPAD_INDICATION)in_pMsgPayload;

		/* Make sure we don't receive more digits than expected */
		if ((in_pCallContext->nDigitReceived + pEvent->un32KeypadFacilitySize) >= (TB640_ISDN_MAX_NB_DIGIT_IN_NUMBERS-1))
		{
			pEvent->un32KeypadFacilitySize = ((TB640_ISDN_MAX_NB_DIGIT_IN_NUMBERS-1)-in_pCallContext->nDigitReceived);
		}

		/* Copy the received digits (skip the numbering plan)*/
		memcpy (
		  &(in_pCallContext->aun8DigitReceived [in_pCallContext->nDigitReceived]),
		  pEvent->aun8KeypadFacility,
		  pEvent->un32KeypadFacilitySize);
		in_pCallContext->nDigitReceived += pEvent->un32KeypadFacilitySize;

		if (!g_AppContext->fAnswerCallsManually)
		{
			/* Do we accept the call ? */
			if (in_pCallContext->nDigitReceived >= in_pCallContext->nNbExpectedDigit)
			{
				/* Copy the called number into our call context */
				memcpy (&(in_pCallContext->aun8OutbandCalledAddress [1]),
				  in_pCallContext->aun8DigitReceived,
				  in_pCallContext->nDigitReceived);

				g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
				TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_2);
			}
		}

		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 */
		TB640_ISDN_LOG (TRACE_LEVEL_4, "Call dropped by user\n");
		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_RESTART)
	{
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
	}

	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, "Timeout while waiting for digit information, trk %d\n",in_pCallContext->un32TrunkIndex);
		TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
		TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
	}

	TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_ANSWER_CALL)
	{
		/* Copy the called number into our call context */
		memcpy (&(in_pCallContext->aun8OutbandCalledAddress [1]),
		  in_pCallContext->aun8DigitReceived,
		  in_pCallContext->nDigitReceived);

		g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
		TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_2);
	}


	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_SENDING_COMPLETED)
		{
			/* No more information from other side and we haven't received enough.. dropping call */
			if (!g_AppContext->fAnswerCallsManually)
			{
				TB640_ISDN_LOG (TRACE_LEVEL_4, "Not enough digit to accept call, 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_6);
			}
		}

		TB640_ISDN_STATE_WAIT;
	}


	TB640_ISDN_STATE_RETURN
}


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

	TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_2)
	{
		/* Answer to the call */
		if ((pTrunkInfo->StackConfiguration.ProtocolSide == TB640_PROTOCOL_SIDE_NETWORK) ||
		   (pTrunkInfo->StackConfiguration.IsdnVariant == TB640_ISDN_VARIANT_AUS_PRI))
		{
			TB640IsdnSendCallProceedingRq(in_pCallContext);
		}
		TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendAlertRq (in_pCallContext));

		if( g_AppContext->fDoConnection )
		{
			if( g_AppContext->fCTBusConnection == TBX_FALSE)
			{
				/* Log CTBus ressource */
				TB640_ISDN_LOG (TRACE_LEVEL_2, "No connection to the CTBus is made\n");
				TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming call 0x%08X calling=%s, called=%s, redir=%s\n", in_pCallContext->hCall, &(in_pCallContext->aun8OutbandCallingAddress[0]), &(in_pCallContext->aun8OutbandCalledAddress[0]), &(in_pCallContext->aun8Redirecting[0]));

				/* Do 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, "Incoming call 0x%08X tries to connect trunk resource 0x%08X with itself(loopback)\n", in_pCallContext->hCall, pTrunkResInfo->hTrunkResource);
			}
			else
			{
				/* Log CTBus ressource */
				TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming 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);
				TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming call 0x%08X calling=%s, called=%s, redir=%s\n", in_pCallContext->hCall, &(in_pCallContext->aun8OutbandCallingAddress[0]), &(in_pCallContext->aun8OutbandCalledAddress[0]), &(in_pCallContext->aun8Redirecting[0]));

				/* Do the connection */
				TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendCreateConnection (pCtbusInfo->hCtbusResource, pTrunkResInfo->hTrunkResource, in_pCallContext));
				in_pCallContext->nCreateRspExpected = 1;
				TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming call 0x%08X tries 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" );
			/* 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_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
	{
		in_pCallContext->fIsdnDisconnected = TBX_TRUE;
		TB640_ISDN_STATE_WAIT;

⌨️ 快捷键说明

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