📄 states.c
字号:
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 + -