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