wanpipe/api/libsangoma/sample_cpp/.svn/text-base/sample.h.svn-base

262 lines
8.8 KiB
Plaintext

/*
sample.h - common definitions used in this application.
*/
#ifndef _SAMPLE_H
#define _SAMPLE_H
#include <libsangoma.h>
#if USE_STELEPHONY_API
#include <libstelephony.h>
#endif
#define USE_WP_LOGGER 1
#define SAMPLE_CPP_MAX_PATH 1024
typedef struct{
unsigned int wanpipe_number;
unsigned int interface_number;
unsigned char silent;
uint16_t txlength;
unsigned char Rx_to_Tx_loopback;
unsigned char decode_fsk_cid;
unsigned char encode_fsk_cid;
unsigned char sw_dtmf;
unsigned char encode_sw_dtmf;
unsigned char voice_codec_alaw;
unsigned char decode_q931;
char szTxFileName[SAMPLE_CPP_MAX_PATH];
unsigned int txcount;
unsigned char driver_config;
unsigned char use_ctrl_dev;
unsigned char use_logger_dev;
int txgain;
int rxgain;
unsigned char use_hardware_echo_canceller;
}wp_program_settings_t;
#define DEV_NAME_LEN 100
extern void cli_out(unsigned int dbg_flag, void *pszFormat, ...);
extern unsigned int verbosity_level;
typedef struct{
//Recieved data
int (*got_rx_data)(void *sang_if_ptr, void *rxhdr, void *rx_data);
//TDM events
void (*got_tdm_api_event)(void *sang_if_ptr, void *event_data);
#if USE_STELEPHONY_API
//FSK Caller ID detected
void (*FSKCallerIDEvent)(void *sang_if_ptr, char * Name, char * CallerNumber, char * CalledNumber, char * DateTime);
//DTMF detected in SOFTWARE
void (*DTMFEvent)(void *sang_if_ptr, long Key);
//Q931 decoder events
void (*Q931Event)(void *callback_context, stelephony_q931_event *pQ931Event);
//FSK Caller ID buffer ready for transmission events
void (*FSKCallerIDTransmit)(void *callback_context, void* buffer);
//DTMF buffer ready for transmission events
void (*SwDtmfTransmit)(void *callback_context, void* buffer);
#endif
#if USE_WP_LOGGER
void (*got_logger_event)(void *sang_if_ptr, wp_logger_event_t *logger_event);
#endif
}callback_functions_t;
static void DecodeLastError(LPSTR lpszFunction)
{
#if defined (__WINDOWS__)
LPVOID lpMsgBuf;
DWORD dwLastErr = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwLastErr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
printf("Last Error: %s (GetLastError() returned: %d)\n", (char*)lpMsgBuf, dwLastErr);
// Free the buffer.
LocalFree( lpMsgBuf );
#endif
}
/* This flag controls debugging of time difference between
* data receive indications. Disabled by default. */
#define DBG_TIMING 0
#if DBG_TIMING
#define DEBUG_HI_RES_PERF if(0)printf
typedef struct _wan_debug{
LARGE_INTEGER LastHiResolutionCounter;
int high_resolution_timediff_value;
unsigned int allowed_deviation_of_timediff_value;
unsigned int timediff_deviation_counter;
int highest_timediff;
int lowest_timediff;
int latest_timediff;
char *debug_name;//optional
}wan_debug_t;
/* Print contents of wan_debug_t structure:
1. TimeDiff info
2. More info will be added in future
*/
static
void
debug_print_dbg_struct(
wan_debug_t *wan_debug_ptr,
const char *caller_name
)
{
printf("timediff_deviation_counter: %d\n\tTimeDiff (ms) between '%s()':\n\tHighest:%d Lowest:%d Expected: %d Latest: %d\n",
wan_debug_ptr->timediff_deviation_counter,
caller_name,
wan_debug_ptr->highest_timediff,
wan_debug_ptr->lowest_timediff,
wan_debug_ptr->high_resolution_timediff_value,
wan_debug_ptr->latest_timediff);
}
/* Call this function to mesure TimeDiff between some function call. */
static
void
debug_update_timediff(
wan_debug_t *wan_debug_ptr,
const char *caller_name
)
{
LARGE_INTEGER CurrentHiResolutionCounter;
LARGE_INTEGER PerformanceFrequency;
unsigned int number_of_HiResCounterTicks_BETWEEN_function_calls;
int timediff_between_function_calls;
if(!wan_debug_ptr->high_resolution_timediff_value){
//TimeDiff debugging is disabled.
return;
}
QueryPerformanceFrequency(&PerformanceFrequency);
QueryPerformanceCounter(&CurrentHiResolutionCounter);
if( wan_debug_ptr->LastHiResolutionCounter.QuadPart == 0 ){
//It is the 1st time this function is running after TimeDiff debugging was enabled.
//Initialize wan_debug_ptr->LastHiResolutionCounter!
QueryPerformanceCounter(&wan_debug_ptr->LastHiResolutionCounter);
return;
}
#if 0
DEBUG_HI_RES_PERF("Frequency: %I64u\n", PerformanceFrequency);
DEBUG_HI_RES_PERF("hi res cnt difference: %I64u\n",
CurrentHiResolutionCounter.QuadPart - wan_debug_ptr->LastHiResolutionCounter.QuadPart);
#endif
////////////////////////////////////////////////////////////////
//Frequency: 1600000000
//hi res cnt difference: 32038864
//1600000000 / 32038864 = 49.939348661051153374227001306913
////////////////////////////////////////////////////////////////
if((CurrentHiResolutionCounter.QuadPart - wan_debug_ptr->LastHiResolutionCounter.QuadPart)){//check for division by zero
number_of_HiResCounterTicks_BETWEEN_function_calls = (unsigned int)
(PerformanceFrequency.QuadPart / (CurrentHiResolutionCounter.QuadPart - wan_debug_ptr->LastHiResolutionCounter.QuadPart));
}
//note that floating point calculations are not allowed in kernel!
if(number_of_HiResCounterTicks_BETWEEN_function_calls){//check for division by zero
timediff_between_function_calls = 1000 / number_of_HiResCounterTicks_BETWEEN_function_calls;
}
#if 0
if(number_of_HiResCounterTicks_BETWEEN_function_calls < 49 || number_of_HiResCounterTicks_BETWEEN_function_calls > 51){
printf("Warning: Invalid Number of SetEvent() calls per second %d!\n", number_of_HiResCounterTicks_BETWEEN_function_calls);
}
#endif
//if(timediff_between_function_calls < 19 || timediff_between_function_calls > 21){
if( timediff_between_function_calls <
(int)(wan_debug_ptr->high_resolution_timediff_value - wan_debug_ptr->allowed_deviation_of_timediff_value) ||
timediff_between_function_calls >
(int)(wan_debug_ptr->high_resolution_timediff_value + wan_debug_ptr->allowed_deviation_of_timediff_value)){
wan_debug_ptr->timediff_deviation_counter++;
// DEBUG_HI_RES_PERF("diff: %d, hi: %d, low: %d\n", timediff_between_function_calls,
// wan_debug_ptr->highest_timediff, wan_debug_ptr->lowest_timediff);
if(timediff_between_function_calls > 0){//because the FIRST timediff is always negative!
int current_time_diff_delta =
timediff_between_function_calls - wan_debug_ptr->high_resolution_timediff_value;
//negative (example: 10 - 20 = -10)
int lowest_time_diff_delta =
wan_debug_ptr->lowest_timediff - wan_debug_ptr->high_resolution_timediff_value;
//positive (example: 30 - 20 = +10)
int highest_time_diff_delta =
wan_debug_ptr->highest_timediff - wan_debug_ptr->high_resolution_timediff_value;
DEBUG_HI_RES_PERF("curr delta: %d, hi delta: %d, low delta: %d\n",
current_time_diff_delta, highest_time_diff_delta, lowest_time_diff_delta);
if(current_time_diff_delta < 0){
//TimeDiff is BELLOW expected
if( current_time_diff_delta < lowest_time_diff_delta ||
wan_debug_ptr->lowest_timediff == 0){
wan_debug_ptr->lowest_timediff = timediff_between_function_calls;
}
}
if(current_time_diff_delta > 0){
//TimeDiff is ABOVE expected
if(current_time_diff_delta > highest_time_diff_delta ||
wan_debug_ptr->highest_timediff == 0){
wan_debug_ptr->highest_timediff = timediff_between_function_calls;
}
}
}//if(timediff_between_function_calls > 0)
if(!(wan_debug_ptr->timediff_deviation_counter % 10)){
debug_print_dbg_struct(wan_debug_ptr, caller_name);
}
}//if( timediff_between_function_calls ...)
wan_debug_ptr->latest_timediff = timediff_between_function_calls;
//prepare for the NEXT call by storing CURRENT counter
QueryPerformanceCounter(&wan_debug_ptr->LastHiResolutionCounter);
}
/* Set (initialize) the TimeDiff part of wan_debug_t structure. */
static
void
debug_set_timing_info(
wan_debug_t *wan_debug_ptr,
int usr_period,
int allowed_deviation_of_timediff_value
)
{
wan_debug_ptr->high_resolution_timediff_value = usr_period;//in milliseconds. 0 - disable TimeDiff debugging.
if(wan_debug_ptr->high_resolution_timediff_value == 0){
wan_debug_ptr->LastHiResolutionCounter.QuadPart = 0;
}
wan_debug_ptr->highest_timediff = wan_debug_ptr->lowest_timediff = 0;
wan_debug_ptr->allowed_deviation_of_timediff_value = allowed_deviation_of_timediff_value;//milliseconds.
//for example: if 2 and high_resolution_timediff_value is 20,
//will result 18 < 20 < 22
}
/////////////////////////////////////////////////////////////////////////////////////
#endif//DBG_TIMING
#endif//_SAMPLE_H