📄 states.c
字号:
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState6: ISDN processing for call state 'six'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState6)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_6)
{
/* The call is disconnecting -> set a maximum timeout for this state */
TB640_ISDN_SET_TIMEOUT (TB640_ISDN_CALL_DISCONNECT_MAX_DURATION_SEC);
/* Take the timestamp */
in_pCallContext->un32Debug = time(NULL);
if (in_pCallContext->fWaitForDisconnection != TBX_TRUE)
{
/* Disconnect the call */
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendDiscRq (in_pCallContext));
}
if (in_pCallContext->fCallValid)
{
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_CLOSING;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
}
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_CMD_DISCONNECT_REQUEST)
{
PTB640_RSP_ISDN_CMD_DISCONNECT_REQUEST pRsp = (PTB640_RSP_ISDN_CMD_DISCONNECT_REQUEST)in_pMsgPayload;
if (TBX_RESULT_FAILURE(pRsp->Result))
{
/* Case of disconnect collision */
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_CONFIRM)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Call timeout while waiting for proper ISDN disconnection, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X is no longer responding.. Restarting trunk %d, timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32TrunkIndex, in_pCallContext->un32TimeslotIndex);
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "%s call 0x%08X origtime=%d, nowtime=%d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32Debug, time(NULL));
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fCallSuccessful = TBX_FALSE;
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState7: ISDN processing for call state 'seven'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState7)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_7)
{
/* The call is restarting -> set a maximum timeout for this state */
TB640_ISDN_SET_TIMEOUT (TB640_ISDN_CALL_RESTART_MAX_DURATION_SEC);
/* The timeslot is now in restarting state */
if (in_pCallContext->fCallValid)
{
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_RESTARTING;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
}
/* Start the restart sequence */
TB640_ISDN_INCREMENT_STATS (un32NbRestartAttempt, 1);
in_pCallContext->nRestartCount = 0;
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendRestartChannelRq (in_pCallContext));
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_FIRST_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_RESTART_ACK)
{
if (pEvent->aun8Data[0] == TBX_FALSE)
{
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "%s call 0x%08X restart FAILED\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X Resetting trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);
TB640_ISDN_INCREMENT_STATS (un32NbResetAttempt, 1);
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
in_pCallContext->fResetChannelOccured = TBX_TRUE;
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendResetChannelRq (in_pCallContext));
TB640_ISDN_STATE_WAIT;
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has successfully restarted\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_13);
}
}
else
{
TB640_ISDN_STATE_WAIT;
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
in_pCallContext->fTimeoutOccured = TBX_TRUE;
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_ISDN_LOG (TRACE_LEVEL_4, "%s call 0x%08X has received a timeout instead of RESTART_ACK, trk %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32TrunkIndex);
TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X Resetting trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);
TB640_ISDN_INCREMENT_STATS (un32NbResetAttempt, 1);
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
in_pCallContext->fResetChannelOccured = TBX_TRUE;
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendResetChannelRq (in_pCallContext));
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_CMD_RESET_CHANNEL_REQUEST)
{
PTB640_RSP_ISDN_CMD_RESET_CHANNEL_REQUEST pRsp = (PTB640_RSP_ISDN_CMD_RESET_CHANNEL_REQUEST)in_pMsgPayload;
if (TBX_RESULT_FAILURE(pRsp->Result))
{
TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X FAILURE of reset for trunk %d timeslot %d\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall,
pTrunkResInfo->un8Trunk, pTrunkResInfo->un8Timeslot);
if (in_pCallContext->fCallValid)
{
/* Marking timeslot as 'condemned' */
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_CONDEMNED;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
}
}
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_13);
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState8: ISDN processing for call state 'eight'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState8)
{
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_8)
{
TB640_ISDN_INCREMENT_STATS (un32NbCallClosingTotal, 1);
if (in_pCallContext->fCallSuccessful)
{
TB640_ISDN_INCREMENT_STATS (un32NbCallCompleted, 1);
}
if (in_pCallContext->fCallValid)
{
if (pTrunkResInfo->Statistics.State != TB640_ISDN_TRUNK_RESOURCE_STATE_CONDEMNED)
{
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_IDLE;
pTrunkResInfo->Statistics.un32LastIdleTimestamp = TBX_GET_TICK();
}
pTrunkResInfo->hCall = (TB640_CALL_HANDLE)NULL;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
}
TB640_ISDN_DECREMENT_TRANSIANT_CALL (1);
if (!in_pCallContext->fCallSuccessful)
{
pTrunkInfo->un32NbCallOpeningFailure++;
}
if (in_pCallContext->fTimeoutOccured)
{
pTrunkInfo->un32NbTimeoutOccured++;
}
TB640_ISDN_DESTROY_CONTEXT;
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_NOT_USED)
TB640_ISDN_STATE_CONTINUE;
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState9: ISDN processing for call state 'nine'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState9)
{
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_9)
{
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_OPENING_OUTGOING;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_CMD_CONNECT_REQUEST)
{
PTB640_RSP_ISDN_CMD_CONNECT_REQUEST pReq = (PTB640_RSP_ISDN_CMD_CONNECT_REQUEST)in_pMsgPayload;
if (TBX_RESULT_SUCCESS(pReq->Result))
{
/* Timeslot is now in use */
in_pCallContext->hCall = pReq->hCall;
pTrunkResInfo->hCall = in_pCallContext->hCall;
/* Remove the trailing '#' if we dialed in overlap mode */
if (in_pCallContext->aun8OutbandCalledAddress [strlen(in_pCallContext->aun8OutbandCalledAddress) - 1] == '#')
{
in_pCallContext->aun8OutbandCalledAddress [strlen(in_pCallContext->aun8OutbandCalledAddress) - 1] = 0;
}
TB640_ISDN_LOG (TRACE_LEVEL_2, "Outgoing call 0x%08X calling=%s, called=%s, redir=%s\n", in_pCallContext->hCall, in_pCallContext->aun8OutbandCallingAddress, in_pCallContext->aun8OutbandCalledAddress, in_pCallContext->aun8Redirecting);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_10);
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received failure for connection request, trk %d\n", in_pCallContext->un32TrunkIndex);
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
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_TIMEOUT)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Timeout while waiting for connection request, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState10: ISDN processing for call state 'ten'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState10)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_10)
{
/* Nothing to do */
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_CALL_PROCEEDING_INDICATION)
{
PTB640_EVT_ISDN_NOTIF_CALL_PROCEEDING_INDICATION pEvent = (PTB640_EVT_ISDN_NOTIF_CALL_PROCEEDING_INDICATION)in_pMsgPayload;
if (pEvent->hTrunkRes != pTrunkResInfo->hTrunkResource)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Unknown trunk resource handle, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
}
else
{
TB640_ISDN_STATE_WAIT;
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received DISC_IND while waiting for ALERT or CONN_CFM, trk %d\n", in_pCallContext->un32TrunkIndex);
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
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_ALERT_INDICATION)
{
if (in_pCallContext->fIsdnNeedToDisconnect == TBX_FALSE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_11);
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Received request for disconnection before getting ALERT, Trk %d\n", in_pCallContext->un32TrunkIndex);
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_NOTIF_CONNECT_CONFIRM)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -