📄 states.c
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
|
| Project: VoiceLink TB640 sample (CAS)
|
| Filename: states.c
|
| Copyright: TelcoBridges 2002-2005, All Rights Reserved
|
| Description: This file contains the CAS state machine
|
| Notes: Tabs = 4
|
*-------------------------------------------------------------------------------------------------------------------------------
|
| Revision: $Revision: 1.48.2.1 $
|
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Includes
*------------------------------------------------------------------------------------------------------------------------------*/
/* System includes */
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
/* Local includes */
#include "tbx_ostypes.h"
#include "tbx_id.h"
#include "tbx_result.h"
#include "tbx_msg.h"
#include "tbx_std.h"
#include "tbx_api.h"
#include "tbx_featmgr.h"
#include "tb640_id.h"
#include "tb640_handle.h"
#include "tb640_adpmgr.h"
#include "tb640_trkmgr.h"
#include "tb640_casmgr.h"
#include "tb640_connmgr.h"
#include "tbx_os_wrapper.h"
#include "tbx_hash.h"
#include "tbx_pool_of_buffers.h"
#include "tbx_timer.h"
#include "tbxasync.h"
#include "tbx_cli.h"
#include "cas.h"
#include "prototypes.h"
#include "macros.h"
#include "tbx_auto_test.h"
/*--------------------------------------------------------------------------------------------------------------------------------
| Forward declarations
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Defines
*------------------------------------------------------------------------------------------------------------------------------*/
#define TB640_CAS_CALL_SETUP_MAX_DURATION_SEC 60
#define TB640_CAS_CALL_DISCONNECT_MAX_DURATION_SEC 15
#define TB640_CAS_CALL_RESTART_MAX_DURATION_SEC 30
/* Special IDs we are going to use for the state machine as "trigger" events */
#define TB640_MSG_ID_NOT_USED TBX_MSG_ID_GEN (0, 0x00)
#define TB640_MSG_ID_CAS_TIMEOUT TBX_MSG_ID_GEN (0, 0x01)
#define TB640_MSG_ID_CAS_MAKE_CALL TBX_MSG_ID_GEN (0, 0x02)
#define TB640_MSG_ID_CAS_DROP_CALL TBX_MSG_ID_GEN (0, 0x03)
#define TB640_MSG_ID_CAS_RESTART TBX_MSG_ID_GEN (0, 0x04)
/*--------------------------------------------------------------------------------------------------------------------------------
| Types
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Versioning
*------------------------------------------------------------------------------------------------------------------------------*/
#if 0
/*@unused@*/ static char g_szFileVersion [] = "$Revision: 1.48.2.1 $";
#endif
/*--------------------------------------------------------------------------------------------------------------------------------
| Global variables
*------------------------------------------------------------------------------------------------------------------------------*/
/* Number of digit expected in the incoming 'called number' */
TBX_UINT32 g_un32NbDigitExpected = 4;
/*--------------------------------------------------------------------------------------------------------------------------------
| Macros
*------------------------------------------------------------------------------------------------------------------------------*/
#define TB640_CAS_STATE_ADD_HISTORY(__ptr__,__Max__,__StateName__, __hCall__, __Event__) \
{ \
PTB640_CAS_HISTORY_ENTRY pEntry; \
\
/* Write the history into the log array */ \
pEntry = &((__ptr__)->aHistoryEntry [(__ptr__)->un32HistoryWriteIdx]); \
pEntry->un32Timestamp = time(NULL); \
pEntry->hCall = (__hCall__); \
pEntry->CurrentState = (__StateName__); \
pEntry->un32Event = (TBX_UINT32)(__Event__); \
\
/* Increment the write pointer */ \
(__ptr__)->un32HistoryWriteIdx++; \
if ((__ptr__)->un32HistoryWriteIdx >= (__Max__)) \
{ \
(__ptr__)->un32HistoryWriteIdx = 0; \
} \
\
/* Check for collision with read pointer */ \
if ((__ptr__)->un32HistoryWriteIdx == (__ptr__)->un32HistoryReadIdx) \
{ \
/* Increment the read pointer */ \
(__ptr__)->un32HistoryReadIdx++; \
if ((__ptr__)->un32HistoryReadIdx >= (__Max__)) \
{ \
(__ptr__)->un32HistoryReadIdx = 0; \
} \
} \
}
#define TB640_CAS_STATE_ENTRY(__StateName__) \
TB640_CAS_STATE_ACTION ReturnAction = TB640_CAS_STATE_ACTION_WAIT; \
PTB640_CAS_ADAPTER_INFO pAdapterInfo; \
PTB640_CAS_TRUNK_INFO pTrunkInfo; \
PTB640_CAS_TRUNK_RESOURCE_INFO pTrunkResInfo; \
PTB640_CAS_CTBUS_INFO pCtbusInfo; \
\
pAdapterInfo = &(g_AppContext->ahAdapterInfo [in_pCallContext->un32AdapterIndex]); \
pTrunkInfo = &(pAdapterInfo->aTrunkInfo [in_pCallContext->un32TrunkIndex]); \
pTrunkResInfo = &(pTrunkInfo->aResourceInfo [in_pCallContext->un32TimeslotIndex]); \
pCtbusInfo = &(pTrunkResInfo->CtbusInfo); \
\
TB640_CAS_STATE_ADD_HISTORY(pTrunkResInfo, TB640_CAS_NB_HISTORY_FOR_TIMESLOT, __StateName__, in_pCallContext->hCall, in_un32MsgId); \
TB640_CAS_STATE_ADD_HISTORY(in_pCallContext, TB640_CAS_NB_HISTORY_FOR_CALL, __StateName__, in_pCallContext->hCall, in_un32MsgId); \
\
switch (in_pCallContext->SubState) \
{ \
case TB640_CAS_CALL_APP_SUB_STATE_ENTRY: \
in_pCallContext->SubState = TB640_CAS_CALL_APP_SUB_STATE_PROCESS; \
#define TB640_CAS_STATE_DECLARE_FIRST_EVENT(__Event__) \
break; \
case TB640_CAS_CALL_APP_SUB_STATE_PROCESS: \
switch (in_un32MsgId) \
{ \
case (__Event__): \
#define TB640_CAS_STATE_DECLARE_NEXT_EVENT(__Event__) \
break; \
case (__Event__): \
#define TB640_CAS_STATE_RETURN \
break; \
default: \
break; \
} \
break; \
default: \
break; \
} \
EndOfStateProcessing: \
return ReturnAction; \
#define TB640_CAS_CHANGE_STATE(__NextState__) \
in_pCallContext->SubState = TB640_CAS_CALL_APP_SUB_STATE_ENTRY; \
in_pCallContext->State = (__NextState__); \
ReturnAction = TB640_CAS_STATE_ACTION_CONTINUE; \
goto EndOfStateProcessing; \
#define TB640_CAS_STATE_WAIT \
ReturnAction = TB640_CAS_STATE_ACTION_WAIT; \
goto EndOfStateProcessing; \
#define TB640_CAS_STATE_CONTINUE \
ReturnAction = TB640_CAS_STATE_ACTION_CONTINUE; \
goto EndOfStateProcessing; \
#define TB640_CAS_DESTROY_CONTEXT \
ReturnAction = TB640_CAS_STATE_ACTION_DESTROY_CONTEXT; \
goto EndOfStateProcessing; \
#define TB640_CAS_STATE_FUNCTION(__FunctionName__) \
TB640_CAS_STATE_ACTION __FunctionName__ ( \
IN TBX_ASYNC_LIB_HANDLE in_hLib, \
IN PTBX_ASYNC_OP_CONTEXT in_pOpContext, \
IN PTB640_CAS_CALL_CONTEXT in_pCallContext, \
IN TBX_UINT32 in_un32MsgId, \
IN PTBX_VOID in_pMsgPayload) \
#define TB640_CAS_SERVICE_FUNCTION(__FunctionName__) \
TBX_RESULT __FunctionName__ ( \
IN PTB640_CAS_CALL_CONTEXT in_pCallContext) \
#define TB640_CAS_SERVICE_FUNCTION_VAR() \
TBX_RESULT result; \
PTB640_CAS_ADAPTER_INFO pAdapterInfo; \
PTB640_CAS_TRUNK_INFO pTrunkInfo; \
PTB640_CAS_TRUNK_RESOURCE_INFO pTrunkResInfo; \
PTBX_ASYNC_REQUEST_CONTEXT pAsyncRequest; \
\
CODE \
{ \
pAsyncRequest = NULL; \
pAdapterInfo = &(g_AppContext->ahAdapterInfo [in_pCallContext->un32AdapterIndex]); \
pTrunkInfo = &(pAdapterInfo->aTrunkInfo [in_pCallContext->un32TrunkIndex]); \
pTrunkResInfo = &(pTrunkInfo->aResourceInfo [in_pCallContext->un32TimeslotIndex]); \
#define TB640_CAS_SERVICE_FUNCTION_ALLOC(__pVar,__MsgId) \
result = TBXAsyncCreateRequest ( \
pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
in_pCallContext->pOpContext, \
(__MsgId), \
sizeof(*(__pVar)), \
TB640CasResponseMessageHandler, \
&pAsyncRequest); \
if (TBX_RESULT_FAILURE(result)) \
{ \
TBX_EXIT_ERROR(result, 0, "Unable to create request context"); \
} \
#define TB640_CAS_SERVICE_FUNCTION_POST() \
result = TBXAsyncPostRequest ( \
pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
pAsyncRequest); \
if (TBX_RESULT_FAILURE(result)) \
{ \
TBX_EXIT_ERROR(result, 0, "Unable to post request"); \
} \
TBX_EXIT_SUCCESS (TBX_RESULT_OK); \
} \
\
ERROR_HANDLING \
{ \
TB640_CAS_LOG (TRACE_LEVEL_ALWAYS, "%s (Result = 0x%08X, %s, line %d)\n", \
TBX_ERROR_DESCRIPTION, TBX_ERROR_RESULT, __FILE__, TBX_ERROR_LINE); \
if (pAsyncRequest != NULL) \
{ \
TBXAsyncDestroyRequest(pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
pAsyncRequest); \
pAsyncRequest = NULL; \
} \
} \
\
CLEANUP \
{ \
} \
\
RETURN; \
#define TB640_CAS_SET_TIMEOUT(__Timeout__) \
{ \
in_pCallContext->fTimeoutOccured = TBX_FALSE; \
TBXAsyncModifyOp ( \
pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
in_pCallContext->pOpContext, \
0, \
(__Timeout__)); \
}
/*--------------------------------------------------------------------------------------------------------------------------------
| Function Prototypes
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT TB640CasProcessStateChange (
IN TBX_ASYNC_LIB_HANDLE in_hLib,
IN PTBX_ASYNC_OP_CONTEXT in_pOpContext,
IN PTB640_CAS_CALL_CONTEXT in_pCallContext,
IN TBX_UINT32 in_un32MsgId,
IN PTBX_VOID in_pMsgPayload);
TBX_VOID TB640CasProcessIncomingCall (
IN TBX_MSG_HANDLE in_hMsg,
IN TBX_UINT32 in_un32AdapterIdx,
IN TBX_UINT32 in_un32OpLibIdx);
TBX_VOID TB640CasProcessResponse (
IN TBX_UINT32 in_un32AdapterIdx,
IN TBX_UINT32 in_un32OpLibIdx,
IN PTBX_ASYNC_OP_CONTEXT in_pOpContext,
IN TBX_UINT32 in_un32MsgId,
IN PTBX_VOID in_pResponsePayload);
TBX_VOID TB640CasProcessEvent (
IN TBX_MSG_HANDLE in_hMsg,
IN TBX_UINT32 in_un32AdapterIdx,
IN TBX_UINT32 in_un32OpLibIdx,
IN TBX_UINT32 in_un32SearchKey);
TBX_VOID
TB640CasResponseMessageHandler(
IN PTBX_VOID in_pvAppContext,
IN PTBX_VOID in_pRequestContext,
IN TBX_UINT32 in_un32SearchKey,
IN TBX_MSG_ID in_MsgId,
IN PTBX_VOID in_pvMsgPayload );
TBX_VOID TB640CasRequestTimeoutHandler (
IN PTBX_VOID in_pvAppContext,
IN PTBX_VOID in_pRequestContext,
IN TBX_UINT32 in_un32SearchKey);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateIdle);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateOne);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateTwo);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateTwoA);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateThree);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateFour);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateFive);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateSix);
TB640_CAS_STATE_FUNCTION(TB640CasProcessStateSeven);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -