00001
00036 #ifndef SANGOMA_INTERFACE_H
00037 #define SANGOMA_INTERFACE_H
00038
00039 #include <stdio.h>
00040 #include <stddef.h>
00041 #include <stdlib.h>
00042
00043 #if defined(__WINDOWS__)
00044 # include <windows.h>
00045 # include <winioctl.h>
00046 # include <conio.h>
00047 # include "bit_win.h"
00048 # include "wanpipe_time.h"
00049
00050 #elif defined(__LINUX__)
00051
00052
00053 # include <stddef.h>
00054 # include <errno.h>
00055 # include <fcntl.h>
00056 # include <string.h>
00057 # include <ctype.h>
00058 # include <sys/stat.h>
00059 # include <sys/ioctl.h>
00060 # include <sys/types.h>
00061 # include <dirent.h>
00062 # include <unistd.h>
00063 # include <sys/socket.h>
00064 # include <netdb.h>
00065 # include <sys/un.h>
00066 # include <sys/wait.h>
00067 # include <unistd.h>
00068 # include <signal.h>
00069 # include <time.h>
00070 #else
00071 # error "sangoma_interface.h: undefined OS type"
00072 #endif
00073
00074
00075 #include "wanpipe_api.h"
00076 #include "sangoma_cthread.h"
00077 #include "sample.h"
00078
00079 #include <libsangoma.h>
00080
00081 #if USE_STELEPHONY_API
00082 # include "libstelephony.h"
00083 #endif
00084
00085
00086
00087 #define SANGOMA_INTERFACE_NUMBER_OF_WAIT_OBJECTS 1
00088 #define SANGOMA_TX_WAIT_OBJECT 0
00089 #define SANGOMA_RX_AND_EVENT_WAIT_OBJECT 0
00090
00095 class sangoma_interface : public sangoma_cthread
00096 {
00097 protected:
00099 sng_fd_t sangoma_dev;
00100
00102 sangoma_wait_obj_t *sng_wait_obj[SANGOMA_INTERFACE_NUMBER_OF_WAIT_OBJECTS];
00103
00105
00107 ULONG rx_frames_count;
00109 ULONG rx_bytes_count;
00110
00112 ULONG bad_rx_frames_count;
00114 DWORD dwRxThreadId;
00115
00117
00119 ULONG tx_bytes_count;
00121 ULONG tx_frames_count;
00123 UCHAR tx_test_byte;
00124
00126
00128 wan_udp_hdr_t wan_udp;
00129
00131 unsigned char get_wan_udphdr_data_byte(unsigned char off);
00132
00134 unsigned char *get_wan_udphdr_data_ptr(unsigned char off);
00135
00137 unsigned char set_wan_udphdr_data_byte(unsigned char off, unsigned char data);
00138
00140 int protocol_cb_size;
00142 int wan_protocol;
00144 unsigned char adapter_type;
00145
00147 wanpipe_api_cmd_t tdm_api_cmd;
00148
00150 wanpipe_api_t wp_api;
00151
00153 void RxThreadFunc();
00155 void TxThreadFunc();
00156
00158 int read_data();
00160 virtual int read_event();
00161
00162 int write_data(wp_api_hdr_t *hdr, void *tx_buffer);
00163
00165 void cleanup();
00166
00168 int get_wan_config();
00169
00171 int get_interface_configuration(if_cfg_t *wanif_conf_ptr);
00172
00174 int get_fe_type(unsigned char* adapter_type);
00175
00177 int wanpipe_api_ioctl(wan_cmd_api_t *api_cmd);
00178
00180 unsigned char wp_brt[256];
00181
00183 void generate_bit_rev_table();
00184
00186 char is_rbs_monitoring_enabled;
00187
00188 #if USE_STELEPHONY_API
00189
00190 stelephony_callback_functions_t scf;
00191 void *stelObj;
00192 void *DtmfBuffer;
00193 void *FskCidBuffer;
00194 void TxStelEncoderBuffer(void *pStelEncoderBuffer);
00195 CRITICAL_SECTION StelTxCriticalSection;
00196 #endif
00197
00199
00200 char terminate_tx_rx_threads;
00201
00203 wp_api_hdr_t rxhdr;
00205 unsigned char rx_data[MAX_NO_DATA_BYTES_IN_FRAME];
00206
00208 wp_api_hdr_t txhdr;
00210 unsigned char tx_data[MAX_NO_DATA_BYTES_IN_FRAME];
00211
00213 if_cfg_t wanif_conf_struct;
00214
00216 int WanpipeNumber;
00217
00219 int InterfaceNumber;
00220
00221 #if DBG_TIMING
00222 wan_debug_t wan_debug_rx_timing;
00223 #endif
00224
00226 callback_functions_t callback_functions;
00227
00228 virtual unsigned long threadFunction(struct ThreadParam& thParam);
00229
00230 public:
00231 char device_name[DEV_NAME_LEN];
00232
00233 char is_logger_dev;
00235
00236 sangoma_interface(int wanpipe_number, int interface_number);
00237 ~sangoma_interface();
00238
00239 int DoManagementCommand(sng_fd_t drv, wan_udp_hdr_t* packet);
00240
00241 virtual int init(callback_functions_t *callback_functions_ptr);
00242 int run();
00243 int stop();
00244
00246 int transmit(wp_api_hdr_t *hdr, void *data);
00247
00249 int receive (wp_api_hdr_t *hdr, void *data);
00250
00251 void bit_swap_a_buffer(unsigned char *data, int len);
00252
00253 void get_te1_56k_stat(void);
00254 void set_lb_modes(unsigned char type, unsigned char mode);
00255 int loopback_command(u_int8_t type, u_int8_t mode, u_int32_t chan_map);
00256
00257 int get_operational_stats(wanpipe_chan_stats_t *stats);
00258 virtual int flush_operational_stats (void);
00259
00260 int CreateSwDtmfTxThread(void *buffer);
00261 int CreateFskCidTxThread(void *buffer);
00262
00263 int enable_rbs_monitoring();
00264 char get_rbs(rbs_management_t *rbs_management_ptr);
00265 char set_rbs(rbs_management_t *rbs_management_ptr);
00266
00267 int tdm_enable_rbs_events(int polls_per_second);
00268 int tdm_disable_rbs_events();
00269
00270 int set_tx_idle_flag(unsigned char new_idle_flag);
00271 int get_open_handles_counter();
00272
00273
00274 int flush_tx_buffers (void);
00275
00276 unsigned char get_adapter_type();
00277 unsigned int get_sub_media();
00278 void set_fe_debug_mode(sdla_fe_debug_t *fe_debug);
00279
00280 void get_api_driver_version(PDRIVER_VERSION version);
00281
00282 void get_card_customer_id(u_int8_t *customer_id);
00283
00284 #if USE_STELEPHONY_API
00285 int resetFSKCID(void);
00286 int sendCallerID(char *name, char *number);
00287 int sendSwDTMF(char dtmf_char);
00288 #endif
00289
00291
00292 int tdm_enable_rxhook_events();
00293 int tdm_disable_rxhook_events();
00294
00295
00296 int tdm_enable_rm_dtmf_events();
00297 int tdm_disable_rm_dtmf_events();
00298
00299
00300 int tdm_enable_dtmf_events(uint8_t channel);
00301 int tdm_disable_dtmf_events(uint8_t channel);
00302
00303 int tdm_enable_ring_detect_events();
00304 int tdm_disable_ring_detect_events();
00305
00306 int tdm_enable_ring_trip_detect_events();
00307 int tdm_disable_ring_trip_detect_events();
00308
00309 int tdm_enable_ring_events();
00310 int tdm_disable_ring_events();
00311
00312 int tdm_txsig_onhook();
00313 int tdm_txsig_offhook();
00314 int tdm_txsig_kewl();
00315
00316
00317
00318 int tdm_txsig_onhooktransfer();
00319
00320 int tdm_enable_tone_events(uint16_t tone_id);
00321 int tdm_disable_tone_events();
00322
00323 int tdm_front_end_activate();
00324 int tdm_front_end_deactivate();
00325
00326 int tdm_control_flash_events(int rxflashtime);
00327
00328
00329
00330
00331
00332
00333
00334 int tdm_control_rm_txgain(int txgain);
00335 int tdm_control_rm_rxgain(int rxgain);
00336
00337
00338
00339
00340 int tdm_set_rm_polarity(int polarity);
00341
00342
00343 int tdm_get_front_end_status(unsigned char *status);
00344
00345 int tdm_set_user_period(unsigned int usr_period);
00347
00348 int tdmv_api_ioctl(wanpipe_api_cmd_t *api_cmd);
00349
00350 int reset_interface_state();
00351
00352 int start_ring_tone();
00353 int stop_ring_tone();
00354
00355 int start_congestion_tone();
00356 int stop_congestion_tone();
00357
00358 int start_busy_tone();
00359 int stop_busy_tone();
00360
00361 int stop_all_tones();
00362
00363 int start_dial_tone();
00364 int stop_dial_tone();
00365
00366 int start_ringing_phone();
00367 int stop_ringing_phone();
00368
00369 int fxo_go_off_hook();
00370 int fxo_go_on_hook();
00371
00372 int fxs_txsig_offhook();
00373
00374
00375 int tdm_enable_bri_bchan_loopback(u_int8_t channel);
00376 int tdm_disable_bri_bchan_loopback(u_int8_t channel);
00377
00378 };
00379
00380 class sangoma_api_ctrl_dev : public sangoma_interface
00381 {
00382 public:
00383 sangoma_api_ctrl_dev(void);
00384 ~sangoma_api_ctrl_dev(void);
00385 virtual int init(callback_functions_t *callback_functions_ptr);
00386 };
00387
00388 class sangoma_api_logger_dev : public sangoma_interface
00389 {
00390 wp_logger_cmd_t logger_cmd;
00391
00392 public:
00393 sangoma_api_logger_dev(void);
00394 ~sangoma_api_logger_dev(void);
00395 virtual int init(callback_functions_t *callback_functions_ptr);
00397 virtual int read_event();
00398 virtual int flush_operational_stats (void);
00399 int get_logger_dev_operational_stats(wp_logger_stats_t *stats);
00400 };
00401
00402 #endif//SANGOMA_INTERFACE_H
00403