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

📄 states.c

📁 telcobridges cas develop
💻 C
📖 第 1 页 / 共 5 页
字号:
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateEight);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateNine);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateTen);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateEleven);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateTwelve);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateThirteen);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateFourtheen);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateFifthheen);

TB640_CAS_SERVICE_FUNCTION(TB640CasSendConnRq);
TB640_CAS_SERVICE_FUNCTION (TB640CasSendAcceptIncomingCallRq);
TB640_CAS_SERVICE_FUNCTION (TB640CasSendConnRspRq);
TB640_CAS_SERVICE_FUNCTION (TB640CasSendDiscRq);
TB640_CAS_SERVICE_FUNCTION (TB640CasSendRestartChannelRq);
TB640_CAS_SERVICE_FUNCTION (TB640CasSendReleaseRq);

TBX_RESULT TB640CasSendCreateConnection (
  IN		TB640_RESOURCE_HANDLE		in_hCtBusResource,
  IN		TB640_RESOURCE_HANDLE		in_hTrunkResource,
  IN		PTB640_CAS_CALL_CONTEXT	in_pCallContext);

TBX_RESULT TB640CasSendDestroyConnection (
  IN		TB640_CONNECTION_HANDLE		in_hConnection,
  IN		PTB640_CAS_CALL_CONTEXT	in_pCallContext);


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


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640CasProcessStateIdle:	CAS processing for call state 'idle'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateIdle)
{
	TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_IDLE)
	{
		TB640_CAS_STATE_CONTINUE;
	}

	TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CAS_MAKE_CALL)
	{
		TB640_CAS_INCREMENT_TRANSIANT_CALL (1);

		/* Check if timeslot is free */
		if ((pTrunkResInfo->Statistics.State != TB640_CAS_TRUNK_RESOURCE_STATE_IDLE) ||
			(pTrunkResInfo->hCall != (TB640_CAS_CALL_HANDLE)NULL))
		{
			/* Call collision case occured on the same timeslot */
			TB640_CAS_LOG (TRACE_LEVEL_0, "Call collision case #1 (timeslot not idle when receiving making call)\n");

			TB640_CAS_INCREMENT_STATS (un32NbOutgoingCallCollision, 1);
			g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_TWELVE);
		}

		in_pCallContext->un8Stream = (TBX_UINT8)-1;
		in_pCallContext->un8Timeslot = (TBX_UINT8)-1;
		in_pCallContext->fCallOriginator = TBX_TRUE;
		TB640CasSendConnRq (in_pCallContext);
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_THIRTEEN);
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_NOTIF_CONNECT_INDICATION)
	{
		TB640_CAS_INCREMENT_TRANSIANT_CALL (1);

		/* Check if timeslot is free */
		if ((pTrunkResInfo->Statistics.State != TB640_CAS_TRUNK_RESOURCE_STATE_IDLE) ||
			(pTrunkResInfo->hCall != (TB640_CAS_CALL_HANDLE)NULL))

		{
			TB640_CAS_INCREMENT_STATS (un32NbIncomingCallCollision, 1);
			g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
		}

		/* Check if we are to refuse all incoming calls */
		if (pAdapterInfo->fRefuseIncomingCalls)

		{
			TB640_CAS_INCREMENT_STATS (un32NbIncomingCallRefusal, 1);
			g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
		}

		/* Timeslot is now in use */
		in_pCallContext->un8Stream = (TBX_UINT8)-1;
		in_pCallContext->un8Timeslot = (TBX_UINT8)-1;
		pTrunkResInfo->hCall = in_pCallContext->hCall;
		pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_OPENING_INCOMING;
		g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);

		/* In R1 direct-inward dialing, we must wait for incoming digits */
		if (((pTrunkInfo->StackConfiguration.Options & TB640_CAS_STACK_OPTIONS_R1_USE_DID) == 0) &&
		    ((pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_WINK_START) ||
 		     (pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_GROUND_START) ||
 		     (pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_LOOP_START) ||
 		     (pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXO)))
		{
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ONE);
		}

		/* Accepting the "called number" */
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_TWO_A);
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_NOTIF_CALL_PRESENT_INDICATION)
	{
		TB640_CAS_INCREMENT_TRANSIANT_CALL (1);

		/* Check if timeslot is free */
		if ((pTrunkResInfo->Statistics.State != TB640_CAS_TRUNK_RESOURCE_STATE_IDLE) ||
			(pTrunkResInfo->hCall != (TB640_CAS_CALL_HANDLE)NULL) ||
			(pAdapterInfo->fRefuseIncomingCalls))
		{
			TB640_CAS_INCREMENT_STATS (un32NbIncomingCallCollision, 1);
			g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
		}

		/* Timeslot is now in use */
		in_pCallContext->un8Stream = (TBX_UINT8)-1;
		in_pCallContext->un8Timeslot = (TBX_UINT8)-1;
		pTrunkResInfo->hCall = in_pCallContext->hCall;
		pTrunkResInfo->Statistics.State = TB640_CAS_TRUNK_RESOURCE_STATE_OPENING_INCOMING;
		g_fRefreshDisplay |= (TB640_CAS_CLI_REFRESH_DISPLAY);

		/* In R1 direct-inward dialing, we must wait for incoming digits */
		if (((pTrunkInfo->StackConfiguration.Options & TB640_CAS_STACK_OPTIONS_R1_USE_DID) == 0) &&
		    ((pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_WINK_START) ||
 		     (pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_GROUND_START) ||
 		     (pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_LOOP_START) ||
 		     (pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXO)))
		{
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ONE);
		}

		/* Accepting the "called number" */
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_TWO_A);
	}

	TB640_CAS_STATE_RETURN
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640CasProcessStateOne:	CAS processing for call state 'one'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateOne)
{
	TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_ONE)
	{
		TB640_CAS_STATE_WAIT;
	}

	TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CAS_NOTIF_DISCONNECT_INDICATION)
	{
		TB640_CAS_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_INCREMENT_TRUNK_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_LOG (TRACE_LEVEL_3, "Detected opening failure on call 0x%08X (trunk %d, timeslot %d)\n",
		  in_pCallContext->hCall,
		  in_pCallContext->un32TrunkIndex,
		  in_pCallContext->un32TimeslotIndex );
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ELEVEN);
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_NOTIF_KEYPAD_INDICATION)
	{
		PTB640_EVT_CAS_NOTIF_KEYPAD_INDICATION		pEvent = (PTB640_EVT_CAS_NOTIF_KEYPAD_INDICATION)in_pMsgPayload;

		/* Make sure we don't receive more digits than expected */
		if ((in_pCallContext->nDigitReceived + 1) < (TB640_CAS_MAX_NB_DIGIT_IN_NUMBERS-1))
		{
			in_pCallContext->aun8DigitReceived [in_pCallContext->nDigitReceived] = pEvent->un8Digit;
			in_pCallContext->nDigitReceived++;
		}

		 /* Do we accept the call ? */
		 if ((TBX_UINT32)in_pCallContext->nDigitReceived >= g_un32NbDigitExpected)
		 {
			/* Copy the data into our internal structure */
			in_pCallContext->aun8DigitReceived [in_pCallContext->nDigitReceived + 1] = 0;
			strcat (in_pCallContext->aun8OutbandCalledAddress, in_pCallContext->aun8DigitReceived);
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_TWO_A);
		 }
		 else
		 {
			TB640_CAS_STATE_WAIT;
		 }
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_DROP_CALL)
	{
		/* In case the user wants to force call shutdown */
		TB640_CAS_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_INCREMENT_TRUNK_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_LOG (TRACE_LEVEL_3, "Detected opening failure on call 0x%08X (trunk %d, timeslot %d)\n",
		  in_pCallContext->hCall,
		  in_pCallContext->un32TrunkIndex,
		  in_pCallContext->un32TimeslotIndex );
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_RESTART)
	{
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_EIGHT);
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_TIMEOUT)
	{
		in_pCallContext->fTimeoutOccured = TBX_TRUE;
		in_pCallContext->fCasNeedToDisconnect = TBX_TRUE;
		TB640_CAS_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_INCREMENT_TRUNK_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_LOG (TRACE_LEVEL_3, "Detected opening failure on call 0x%08X (trunk %d, timeslot %d)\n",
		  in_pCallContext->hCall,
		  in_pCallContext->un32TrunkIndex,
		  in_pCallContext->un32TimeslotIndex );
		TB640_CAS_INCREMENT_STATS (un32NbTimeoutOccured, 1);
		TB640_CAS_INCREMENT_TRUNK_STATS (un32NbTimeoutOccured, 1);
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
	}

	TB640_CAS_STATE_RETURN
}


/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  TB640CasProcessStateTwoA:	CAS processing for call state 'two A'
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateTwoA)
{
	TB640_CAS_STATE_ENTRY(TB640_CAS_CALL_APP_STATE_TWO_A)
	{
		/* Make sure that the 'called number' is valid */
		if ((pTrunkInfo->StackConfiguration.CasVariant != TB640_CAS_VARIANT_FXS_LOOP_START) &&
			!((pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_GROUND_START) &&
			  (pTrunkInfo->StackConfiguration.ProtocolSide == TB640_CAS_PROTOCOL_SIDE_USER)))
		{
			if (strlen(in_pCallContext->aun8OutbandCalledAddress) == 0)
			{
				/* Invalid called number - refuse the call */
				TB640_CAS_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
				TB640_CAS_INCREMENT_TRUNK_STATS (un32NbCallOpeningFailure, 1);
				TB640_CAS_LOG (TRACE_LEVEL_MAX, "Detected invalid 'called address' on call 0x%08X (trunk %d, timeslot %d)\n",
				  in_pCallContext->hCall,
				  in_pCallContext->un32TrunkIndex,
				  in_pCallContext->un32TimeslotIndex );

				TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
			}
		}

		/* Accept incoming number (only useful in R1 non-DDI mode) */
		if (
			 ((pTrunkInfo->StackConfiguration.Options & TB640_CAS_STACK_OPTIONS_R1_USE_DID) == 0) &&
			 (
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_WINK_START) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_GROUND_START) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXS_LOOP_START) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_FXO)
			 )
		   )
		{
			/* Disconnect the tone detector and generator right away */
			TB640CasSendAcceptIncomingCallRq(in_pCallContext);
		}
		else
		{
			/* Answer to the call and wait for the answer*/
			TB640CasSendConnRspRq (in_pCallContext);
		}
		TB640_CAS_STATE_WAIT;
	}

	TB640_CAS_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_CAS_NOTIF_DISCONNECT_INDICATION)
	{
		in_pCallContext->fCasDisconnected = TBX_TRUE;
		TB640_CAS_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_INCREMENT_TRUNK_STATS (un32NbCallOpeningFailure, 1);
		TB640_CAS_LOG (TRACE_LEVEL_3, "Detected opening failure on call 0x%08X (trunk %d, timeslot %d)\n",
		  in_pCallContext->hCall,
		  in_pCallContext->un32TrunkIndex,
		  in_pCallContext->un32TimeslotIndex );
		TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_ELEVEN);
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_CMD_ACCEPT_INCOMING_CALL)
	{
		PTB640_RSP_CAS_CMD_ACCEPT_INCOMING_CALL			pRsp = (PTB640_RSP_CAS_CMD_ACCEPT_INCOMING_CALL)in_pMsgPayload;;

		if (TBX_RESULT_SUCCESS(pRsp->Result))
		{
			/* Answer to the call and wait for the answer*/
			TB640CasSendConnRspRq (in_pCallContext);
		}
		else
		{
			TB640_CAS_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
			TB640_CAS_INCREMENT_TRUNK_STATS (un32NbCallOpeningFailure, 1);
			TB640_CAS_LOG (TRACE_LEVEL_3, "Incoming call acceptance was refused on call 0x%08X (trunk %d, timeslot %d)\n",
			  in_pCallContext->hCall,
			  in_pCallContext->un32TrunkIndex,
			  in_pCallContext->un32TimeslotIndex );
			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_SEVEN);
		}
		TB640_CAS_STATE_WAIT;
	}

	TB640_CAS_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CAS_CMD_CONNECT_RESPONSE)
	{
		PTB640_RSP_CAS_CMD_CONNECT_RESPONSE			pRsp = (PTB640_RSP_CAS_CMD_CONNECT_RESPONSE)in_pMsgPayload;;

		if (TBX_RESULT_SUCCESS(pRsp->Result))
		{
			/* In case of R2 stacks, we need to wait for the DIALING_DONE(BACKWARD_SIG_DONE) to continue */
			if ((pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_R2_CHINA) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_R2_KOREA) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_R2_SINGAPORE) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_R2_BANGLADESH) ||
				(pTrunkInfo->StackConfiguration.CasVariant == TB640_CAS_VARIANT_R2_GENERIC))
			{
				TB640_CAS_STATE_WAIT;
			}

			TB640_CAS_CHANGE_STATE (TB640_CAS_CALL_APP_STATE_TWO);
		}

⌨️ 快捷键说明

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