📄 states.c
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
|
| Project: VoiceLink TB640 sample (ISDN)
|
| Filename: states.c
|
| Copyright: TelcoBridges 2002-2003, All Rights Reserved
|
| Description: This file contains the ISDN state machine
|
| Notes: Tabs = 4
|
*-------------------------------------------------------------------------------------------------------------------------------
|
| Revision: $Revision: 1.107.2.4 $
|
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| 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_isdnmgr.h"
#include "tb640_isdnmgr_ext.h"
#include "tb640_isdnmgr_ie.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 "isdn.h"
#include "prototypes.h"
#include "macros.h"
/*--------------------------------------------------------------------------------------------------------------------------------
| Forward declarations
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Defines
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Types
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Versioning
*------------------------------------------------------------------------------------------------------------------------------*/
#ifdef WIN32
/*@unused@*/ static char g_szFileVersion [] = "$Revision: 1.107.2.4 $";
#endif
/*--------------------------------------------------------------------------------------------------------------------------------
| Global variables
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Macros
*------------------------------------------------------------------------------------------------------------------------------*/
#define TB640_ISDN_STATE_ADD_HISTORY(__ptr__,__Max__,__StateName__, __hCall__, __Event__) \
{ \
PTB640_ISDN_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_ISDN_STATE_ENTRY(__StateName__) \
TB640_ISDN_STATE_ACTION ReturnAction = TB640_ISDN_STATE_ACTION_WAIT; \
PTB640_ISDN_ADAPTER_INFO pAdapterInfo; \
PTB640_ISDN_TRUNK_INFO pTrunkInfo; \
PTB640_ISDN_TRUNK_RESOURCE_INFO pTrunkResInfo; \
PTB640_ISDN_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_ISDN_STATE_ADD_HISTORY(pTrunkResInfo, TB640_ISDN_NB_HISTORY_FOR_TIMESLOT, __StateName__, in_pCallContext->hCall, in_un32MsgId); \
TB640_ISDN_STATE_ADD_HISTORY(in_pCallContext, TB640_ISDN_NB_HISTORY_FOR_CALL, __StateName__, in_pCallContext->hCall, in_un32MsgId); \
\
switch (in_pCallContext->SubState) \
{ \
case TB640_ISDN_CALL_APP_SUB_STATE_ENTRY: \
in_pCallContext->SubState = TB640_ISDN_CALL_APP_SUB_STATE_PROCESS; \
#define TB640_ISDN_STATE_DECLARE_FIRST_EVENT(__Event__) \
break; \
case TB640_ISDN_CALL_APP_SUB_STATE_PROCESS: \
switch (in_un32MsgId) \
{ \
case (__Event__): \
#define TB640_ISDN_STATE_DECLARE_NEXT_EVENT(__Event__) \
break; \
case (__Event__): \
#define TB640_ISDN_STATE_DECLARE_EQUIV_EVENT(__Event__) \
case (__Event__): \
#define TB640_ISDN_STATE_RETURN \
break; \
default: \
break; \
} \
break; \
default: \
break; \
} \
EndOfStateProcessing: \
return ReturnAction; \
#define TB640_ISDN_CHANGE_STATE(__NextState__) \
in_pCallContext->SubState = TB640_ISDN_CALL_APP_SUB_STATE_ENTRY; \
in_pCallContext->State = (__NextState__); \
ReturnAction = TB640_ISDN_STATE_ACTION_CONTINUE; \
goto EndOfStateProcessing; \
#define TB640_ISDN_STATE_WAIT \
ReturnAction = TB640_ISDN_STATE_ACTION_WAIT; \
goto EndOfStateProcessing; \
#define TB640_ISDN_STATE_CONTINUE \
ReturnAction = TB640_ISDN_STATE_ACTION_CONTINUE; \
goto EndOfStateProcessing; \
#define TB640_ISDN_DESTROY_CONTEXT \
ReturnAction = TB640_ISDN_STATE_ACTION_DESTROY_CONTEXT; \
goto EndOfStateProcessing; \
#define TB640_ISDN_STATE_FUNCTION(__FunctionName__) \
TB640_ISDN_STATE_ACTION __FunctionName__ ( \
IN TBX_ASYNC_LIB_HANDLE in_hLib, \
IN PTBX_ASYNC_OP_CONTEXT in_pOpContext, \
IN PTB640_ISDN_CALL_CONTEXT in_pCallContext, \
IN TBX_UINT32 in_un32MsgId, \
IN PTBX_VOID in_pMsgPayload) \
#define TB640_ISDN_SERVICE_FUNCTION(__FunctionName__) \
TBX_RESULT __FunctionName__ ( \
IN PTB640_ISDN_CALL_CONTEXT in_pCallContext) \
#define TB640_ISDN_SERVICE_FUNCTION_VAR() \
TBX_RESULT result; \
PTB640_ISDN_ADAPTER_INFO pAdapterInfo; \
PTB640_ISDN_TRUNK_INFO pTrunkInfo; \
PTB640_ISDN_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_ISDN_SERVICE_FUNCTION_ALLOC(__pVar,__MsgId) \
result = TBXAsyncCreateRequest ( \
pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
in_pCallContext->pOpContext, \
(__MsgId), \
sizeof(*(__pVar)), \
TB640IsdnResponseMessageHandler, \
&pAsyncRequest); \
if (TBX_RESULT_FAILURE(result)) \
{ \
TBX_EXIT_ERROR(result, 0, "Unable to create request context"); \
} \
#define TB640_ISDN_SERVICE_FUNCTION_POST() \
result = TBXAsyncPostRequest ( \
pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
pAsyncRequest); \
if (TBX_RESULT_FAILURE(result)) \
{ \
if (result == TBX_RESULT_API_ADA_NOT_READY) \
{ \
TBX_EXIT_ERROR(result, 0, "Detected board failure/removal"); \
} \
else \
{ \
TBX_EXIT_ERROR(result, 0, "Unable to post request"); \
} \
} \
TBX_EXIT_SUCCESS (TBX_RESULT_OK); \
} \
\
ERROR_HANDLING \
{ \
TB640_ISDN_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_ISDN_CALL_AND_VALIDATE(__Fct__) \
result = __Fct__; \
if (TBX_RESULT_FAILURE(result)) \
{ \
if (result == TBX_RESULT_API_ADA_NOT_READY) \
{ \
TB640_ISDN_CHANGE_STATE (TB640_ISDN_CALL_APP_STATE_8); \
} \
else \
{ \
TB640_ISDN_LOG (TRACE_LEVEL_4, "Error calling function at line %d\n", __LINE__); \
} \
} \
#define TB640_ISDN_SET_TIMEOUT(__Timeout__) \
{ \
in_pCallContext->fTimeoutOccured = TBX_FALSE; \
TBXAsyncModifyOp ( \
pAdapterInfo->ahOperationLib [pTrunkInfo->un32OpLibIdx], \
in_pCallContext->pOpContext, \
0, \
(__Timeout__)); \
}
#define TB640_ISDN_BCHAN_STATE_TO_STRING(__State__) \
(((__State__)==TB640_ISDN_BCHANNEL_STATUS_IN_SERVICE)?"In service": \
((__State__)==TB640_ISDN_BCHANNEL_STATUS_MAINTENANCE)?"Maintenance": \
((__State__)==TB640_ISDN_BCHANNEL_STATUS_OUT_OF_SERVICE)?"Out of service": \
"Unknown")
/*--------------------------------------------------------------------------------------------------------------------------------
| Function Prototypes
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_VOID TB640IsdnProcessIncomingCall (
IN TBX_MSG_HANDLE in_hMsg,
IN TBX_UINT32 in_un32AdapterIdx,
IN TBX_UINT32 in_un32OpLibIdx);
TBX_VOID TB640IsdnProcessResponse (
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 TB640IsdnProcessEvent (
IN TBX_MSG_HANDLE in_hMsg,
IN TBX_UINT32 in_un32AdapterIdx,
IN TBX_UINT32 in_un32OpLibIdx,
IN TBX_UINT32 in_un32SearchKey);
TBX_VOID TB640IsdnResponseMessageHandler(
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 TB640IsdnGetCtBusResource (
IN TBX_UINT32 in_un32AdapterIdx,
OUT PTBX_UINT8 out_pun8Stream,
OUT PTBX_UINT8 out_pun8Timeslot);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -