📄 states.c
字号:
}
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_DISCONNECT_RECEIVED)
{
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CONN_OP_CREATE)
{
PTB640_RSP_CONN_OP_CREATE pRsp = (PTB640_RSP_CONN_OP_CREATE)in_pMsgPayload;
/* One less response to obtain */
in_pCallContext->nCreateRspExpected--;
/* Was the connection successful ? */
if (TBX_RESULT_SUCCESS(pRsp->Result))
{
in_pCallContext->fConnected = TBX_TRUE;
in_pCallContext->hConnection = pRsp->hConn;
pTrunkResInfo->hConnection = pRsp->hConn;
TB640_ISDN_LOG (TRACE_LEVEL_2, "Incoming call 0x%08X connected with handle 0x%08X\n", in_pCallContext->hCall, in_pCallContext->hConnection);
/* Force a restart ? */
if (in_pCallContext->fNeedToRestart != TBX_FALSE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Incoming call 0x%08X had an error while connecting resources, trk %d\n", in_pCallContext->hCall, in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
/* Force a restart ? */
if (in_pCallContext->fNeedToRestart != TBX_FALSE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
else
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_5);
}
}
/* Were we disconnected on our ISDN channel */
if ((in_pCallContext->fIsdnDisconnected == TBX_TRUE) || (in_pCallContext->fIsdnNeedToDisconnect == TBX_TRUE))
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Call disconnected while waiting for res. connection, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningFailure, 1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
/* 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_NEXT_EVENT (TB640_MSG_ID_ISDN_DROP_CALL)
{
/* In case the user wants to force call shutdown */
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
in_pCallContext->fNeedToRestart = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
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, "Call timeout while waiting for connection response, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState3: ISDN processing for call state 'three'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState3)
{
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_3)
{
TBX_UINT32 un32CallDuration;
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_ACTIVE;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
TB640_ISDN_INCREMENT_STATS (un32NbCallOpeningSuccess, 1);
in_pCallContext->fCallSuccessful = TBX_TRUE;
/* Do we need to do a random call duration */
if (in_pCallContext->un32MinCallDuration == in_pCallContext->un32MaxCallDuration)
{
if (in_pCallContext->un32MinCallDuration == (TBX_UINT32)-1)
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has an infinite call duration\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall);
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has a %d second call duration\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->un32MinCallDuration);
}
/* Fixed call duration */
un32CallDuration = in_pCallContext->un32MinCallDuration;
}
else
{
TBX_UINT32 un32Possibility;
/* Random call generation */
un32CallDuration = (in_pCallContext->un32MaxCallDuration - in_pCallContext->un32MinCallDuration) + 1;
/* Give a number between 0 and 999 */
un32Possibility = (rand() * 1000) / RAND_MAX;
if (un32Possibility == 1000)
{
un32Possibility = 999;
}
un32CallDuration = un32Possibility / (1000 / un32CallDuration);
un32CallDuration += in_pCallContext->un32MinCallDuration;
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has a %d second call duration (random)\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, un32CallDuration);
}
/* Set the timeout on the call */
if (un32CallDuration > 0)
{
/* Call duration of x second on the call */
TB640_ISDN_SET_TIMEOUT (un32CallDuration);
}
else
{
/* Call needs to be disconnected immediately */
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
TB640_ISDN_DECREMENT_TRANSIANT_CALL (1);
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
{
TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
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_DISCONNECT_RECEIVED)
{
TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_DROP_CALL)
{
TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);
/* The user wants to drop a call */
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_4);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
TB640_ISDN_INCREMENT_TRANSIANT_CALL (1);
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState4: ISDN processing for call state 'four'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState4)
{
TBX_RESULT result = TBX_RESULT_OK;
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_4)
{
in_pCallContext->nDestroyRspExpected = 0;
/* The call is disconnecting -> set a maximum timeout */
TB640_ISDN_SET_TIMEOUT (TB640_ISDN_CALL_DISCONNECT_MAX_DURATION_SEC);
/* If there was a connection, let's disconnect */
if (in_pCallContext->fConnected == TBX_TRUE)
{
if (in_pCallContext->fCallValid)
{
pTrunkResInfo->Statistics.State = TB640_ISDN_TRUNK_RESOURCE_STATE_DISCONNECTING;
g_fRefreshDisplay |= TB640_ISDN_CLI_REFRESH_DISPLAY;
}
TB640_ISDN_CALL_AND_VALIDATE (TB640IsdnSendDestroyConnection (in_pCallContext->hConnection, in_pCallContext));
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X is closing connection 0x%08X\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->hConnection);
in_pCallContext->nDestroyRspExpected++;
TB640_ISDN_STATE_WAIT;
}
else
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_5);
}
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_ISDN_NOTIF_DISCONNECT_INDICATION)
{
in_pCallContext->fIsdnDisconnected = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_CONN_OP_DESTROY)
{
PTB640_RSP_CONN_OP_DESTROY pRsp = (PTB640_RSP_CONN_OP_DESTROY)in_pMsgPayload;
if (TBX_RESULT_SUCCESS(pRsp->Result))
{
TB640_ISDN_LOG (TRACE_LEVEL_2, "%s call 0x%08X has closed connection 0x%08X successfully\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->hConnection);
in_pCallContext->fConnected = TBX_FALSE;
}
else
{
TB640_ISDN_LOG (TRACE_LEVEL_3, "%s call 0x%08X has NOT closed connection 0x%08X\n", (in_pCallContext->fCallOriginator?"Outgoing":"Incoming"), in_pCallContext->hCall, in_pCallContext->hConnection);
in_pCallContext->fCallSuccessful = TBX_FALSE;
}
/* One less response to receive */
in_pCallContext->hConnection = (TB640_CONNECTION_HANDLE)NULL;
if (in_pCallContext->fCallValid)
{
pTrunkResInfo->hConnection = (TB640_CONNECTION_HANDLE)NULL;
}
in_pCallContext->nDestroyRspExpected--;
/* Wait until all response are received */
if (in_pCallContext->nCreateRspExpected > 0)
{
TB640_ISDN_STATE_WAIT;
}
/* Do we need to force a restart ? */
if (in_pCallContext->fNeedToRestart != TBX_FALSE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_7);
}
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_5);
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_RESTART)
{
in_pCallContext->fNeedToRestart = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_DECLARE_NEXT_EVENT (TB640_MSG_ID_ISDN_TIMEOUT)
{
TB640_ISDN_LOG (TRACE_LEVEL_4, "Call timeout while waiting for disconnection response, trk %d\n", in_pCallContext->un32TrunkIndex);
TB640_ISDN_INCREMENT_STATS (un32NbTimeoutOccured, 1);
in_pCallContext->fTimeoutOccured = TBX_TRUE;
in_pCallContext->fIsdnNeedToDisconnect = TBX_TRUE;
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_RETURN
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnProcessState5: ISDN processing for call state 'five'
|
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_ISDN_STATE_FUNCTION(TB640IsdnProcessState5)
{
TB640_ISDN_STATE_ENTRY(TB640_ISDN_CALL_APP_STATE_5)
{
if (in_pCallContext->fIsdnDisconnected == TBX_TRUE)
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8);
}
else
{
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_6);
}
}
TB640_ISDN_STATE_DECLARE_FIRST_EVENT (TB640_MSG_ID_NOT_USED)
{
TB640_ISDN_STATE_WAIT;
}
TB640_ISDN_STATE_RETURN
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -