⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 states.c

📁 telcobridges cas develop
💻 C
📖 第 1 页 / 共 5 页
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |	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 + -