00001
00035 #include "libsangoma.h"
00036 #include "lib_api.h"
00037
00038 static u_int32_t poll_events_bitmap = 0;
00039
00050 #define TEST_NUMBER_OF_OBJECTS 1
00051
00052 static sangoma_wait_obj_t *sangoma_wait_objects[TEST_NUMBER_OF_OBJECTS];
00053
00054
00055
00056 static unsigned char rxdata[MAX_NO_DATA_BYTES_IN_FRAME];
00057 static unsigned char txdata[MAX_NO_DATA_BYTES_IN_FRAME];
00058
00059 typedef struct sangoma_chan {
00060 int spanno;
00061 int channo;
00062 } sangoma_chan_t;
00063 sangoma_chan_t sangoma_channels[TEST_NUMBER_OF_OBJECTS];
00064
00065
00066 unsigned char rx_rbs_bits = WAN_RBS_SIG_A;
00067 FILE *pRxFile;
00068 int application_termination_flag = 0;
00069
00070
00071
00072
00073
00074 int __cdecl main(int argc, char* argv[]);
00075 int open_sangoma_device(void);
00076 void handle_span_chan(int open_device_counter);
00077 int handle_tdm_event(uint32_t dev_index);
00078 int handle_data(uint32_t dev_index, int flags_out);
00079 int read_data(uint32_t dev_index, wp_api_hdr_t *rx_hdr, void *rx_buffer, int rx_buffer_length);
00080 int write_data(uint32_t dev_index, wp_api_hdr_t *tx_hdr, void *tx_buffer, int tx_len);
00081 int dtmf_event(sng_fd_t fd,unsigned char digit,unsigned char type,unsigned char port);
00082 int rbs_event(sng_fd_t fd,unsigned char rbs_bits);
00083 int rxhook_event(sng_fd_t fd,unsigned char hook_state);
00084 int rxring_event(sng_fd_t fd,unsigned char ring_state);
00085 int ringtrip_event (sng_fd_t fd, unsigned char ring_state);
00086 int write_data_to_file(unsigned char *data, unsigned int data_length);
00087 int sangoma_print_stats(sng_fd_t sangoma_dev);
00088 void cleanup(void);
00089 int handle_fe_rw (void);
00090
00091 #ifdef __WINDOWS__
00092 BOOL WINAPI TerminateHandler(DWORD dwCtrlType);
00093 #else
00094 void TerminateHandler(int);
00095 #endif
00096
00097
00098
00099
00100
00108 void print_rxdata(unsigned char *data, int datalen, wp_api_hdr_t *hdr);
00109 void print_rxdata(unsigned char *data, int datalen, wp_api_hdr_t *hdr)
00110 {
00111 int i;
00112 int err=0;
00113
00114 #ifdef WP_API_FEATURE_RX_TX_ERRS
00115 err=hdr->wp_api_rx_hdr_errors;
00116 #endif
00117 printf("Data: (Len=%i,Errs=%i)\n",datalen,err);
00118 for(i = 0; i < datalen; i++) {
00119 if((i % 20 == 0)){
00120 if(i){
00121 printf("\n");
00122 }
00123 }
00124 printf("%02X ", data[i]);
00125 #if 0
00126
00127 if(i > 100){
00128 printf("...\n");
00129 break;
00130 }
00131 #endif
00132 }
00133 printf("\n");
00134 }
00135
00136
00137 int sangoma_print_stats(sng_fd_t sangoma_dev)
00138 {
00139 int err;
00140 unsigned char firm_ver, cpld_ver;
00141 wanpipe_api_t wp_api;
00142 wanpipe_chan_stats_t stats_str;
00143 wanpipe_chan_stats_t *stats=&stats_str;
00144 memset(&wp_api,0,sizeof(wp_api));
00145
00146
00147 err=sangoma_get_stats(sangoma_dev, &wp_api, stats);
00148 if (err) {
00149 printf("sangoma_get_stats(() failed (err: %d (0x%X))!\n", err, err);
00150 return 1;
00151 }
00152
00153 printf( "******* OPERATIONAL_STATS *******\n");
00154
00155 printf("\trx_packets\t: %u\n", stats->rx_packets);
00156 printf("\ttx_packets\t: %u\n", stats->tx_packets);
00157 printf("\trx_bytes\t: %u\n", stats->rx_bytes);
00158 printf("\ttx_bytes\t: %u\n", stats->tx_bytes);
00159 printf("\trx_errors\t: %u\n", stats->rx_errors);
00160 printf("\ttx_errors\t: %u\n", stats->tx_errors);
00161 printf("\trx_dropped\t: %u\n", stats->rx_dropped);
00162 printf("\ttx_dropped\t: %u\n", stats->tx_dropped);
00163 printf("\tmulticast\t: %u\n", stats->multicast);
00164 printf("\tcollisions\t: %u\n", stats->collisions);
00165
00166 printf("\trx_length_errors: %u\n", stats->rx_length_errors);
00167 printf("\trx_over_errors\t: %u\n", stats->rx_over_errors);
00168 printf("\trx_crc_errors\t: %u\n", stats->rx_crc_errors);
00169 printf("\trx_frame_errors\t: %u\n", stats->rx_frame_errors);
00170 printf("\trx_fifo_errors\t: %u\n", stats->rx_fifo_errors);
00171 printf("\trx_missed_errors: %u\n", stats->rx_missed_errors);
00172
00173 printf("\ttx_aborted_errors: %u\n", stats->tx_aborted_errors);
00174 printf("\tTx Idle Data\t: %u\n", stats->tx_carrier_errors);
00175
00176 printf("\ttx_fifo_errors\t: %u\n", stats->tx_fifo_errors);
00177 printf("\ttx_heartbeat_errors: %u\n", stats->tx_heartbeat_errors);
00178 printf("\ttx_window_errors: %u\n", stats->tx_window_errors);
00179
00180 printf("\n\ttx_packets_in_q: %u\n", stats->current_number_of_frames_in_tx_queue);
00181 printf("\ttx_queue_size: %u\n", stats->max_tx_queue_length);
00182
00183 printf("\n\trx_packets_in_q: %u\n", stats->current_number_of_frames_in_rx_queue);
00184 printf("\trx_queue_size: %u\n", stats->max_rx_queue_length);
00185
00186 printf("\n\trx_events_in_q: %u\n", stats->current_number_of_events_in_event_queue);
00187 printf("\trx_event_queue_size: %u\n", stats->max_event_queue_length);
00188 printf("\trx_events: %u\n", stats->rx_events);
00189 printf("\trx_events_dropped: %u\n", stats->rx_events_dropped);
00190
00191 printf("\tHWEC tone (DTMF) events counter: %u\n", stats->rx_events_tone);
00192 printf( "*********************************\n");
00193
00194 SANGOMA_INIT_TDM_API_CMD(wp_api);
00195 err=sangoma_get_driver_version(sangoma_dev,&wp_api, NULL);
00196 if (err) {
00197 return 1;
00198 }
00199 printf("\tDriver Version: %u.%u.%u.%u\n",
00200 wp_api.wp_cmd.version.major,
00201 wp_api.wp_cmd.version.minor,
00202 wp_api.wp_cmd.version.minor1,
00203 wp_api.wp_cmd.version.minor2);
00204
00205 SANGOMA_INIT_TDM_API_CMD(wp_api);
00206 err=sangoma_get_firmware_version(sangoma_dev, &wp_api, &firm_ver);
00207 if (err) {
00208 return 1;
00209 }
00210 printf("\tFirmware Version: %X\n",
00211 firm_ver);
00212
00213 SANGOMA_INIT_TDM_API_CMD(wp_api);
00214 err=sangoma_get_cpld_version(sangoma_dev, &wp_api, &cpld_ver);
00215 if (err) {
00216 return 1;
00217 }
00218 printf("\tCPLD Version: %X\n",
00219 cpld_ver);
00220
00221 return 0;
00222 }
00223
00233 int read_data(uint32_t dev_index, wp_api_hdr_t *rx_hdr, void *rx_buffer, int rx_buffer_length)
00234 {
00235 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[dev_index]);
00236 sangoma_chan_t *chan = sangoma_wait_obj_get_context(sangoma_wait_objects[dev_index]);
00237 int Rx_lgth = 0;
00238 static int Rx_count= 0;
00239 wanpipe_api_t tdm_api;
00240
00241 memset(&tdm_api, 0x00, sizeof(tdm_api));
00242 memset(rx_hdr, 0, sizeof(wp_api_hdr_t));
00243
00244
00245 Rx_lgth = sangoma_readmsg(
00246 dev_fd,
00247 rx_hdr,
00248 sizeof(wp_api_hdr_t),
00249 rx_buffer,
00250 rx_buffer_length,
00251 0);
00252 if(Rx_lgth <= 0) {
00253 printf("Span: %d, Chan: %d: Error receiving data!\n",
00254 chan->spanno, chan->channo);
00255 return 1;
00256 }
00257
00258
00259 #ifdef WP_API_FEATURE_RX_TX_ERRS
00260 if (rx_hdr->wp_api_rx_hdr_error_map) {
00261 if (rx_hdr->wp_api_rx_hdr_error_map & 1<<WP_FIFO_ERROR_BIT) {
00262 printf("Span: %d, Chan: %d rx fifo error 0x%02X\n",chan->spanno,chan->channo,rx_hdr->wp_api_rx_hdr_error_map);
00263 }
00264 if (rx_hdr->wp_api_rx_hdr_error_map & 1<<WP_CRC_ERROR_BIT) {
00265 printf("Span: %d, Chan: %d rx crc error 0x%02X\n",chan->spanno,chan->channo,rx_hdr->wp_api_rx_hdr_error_map);
00266 }
00267 if (rx_hdr->wp_api_rx_hdr_error_map & 1<<WP_ABORT_ERROR_BIT) {
00268 printf("Span: %d, Chan: %d rx abort error 0x%02X\n",chan->spanno,chan->channo,rx_hdr->wp_api_rx_hdr_error_map);
00269 }
00270 if (rx_hdr->wp_api_rx_hdr_error_map & 1<<WP_FRAME_ERROR_BIT) {
00271 printf("Span: %d, Chan: %d rx framing error 0x%02X\n",chan->spanno,chan->channo,rx_hdr->wp_api_rx_hdr_error_map);
00272 }
00273 if (rx_hdr->wp_api_rx_hdr_error_map & 1<<WP_DMA_ERROR_BIT) {
00274 printf("Span: %d, Chan: %d rx dma error 0x%02X\n",chan->spanno,chan->channo,rx_hdr->wp_api_rx_hdr_error_map);
00275 }
00276
00277 }
00278 #endif
00279
00280 Rx_count++;
00281
00282 if (verbose){
00283 print_rxdata(rx_buffer, Rx_lgth,rx_hdr);
00284 }
00285
00286 if (stats_period && Rx_count % stats_period == 0) {
00287 sangoma_print_stats(dev_fd);
00288 }
00289
00290
00291 if(rbs_events == 1 && (Rx_count % 400) == 0){
00292
00293
00294
00295
00296
00297 if(rx_rbs_bits == WAN_RBS_SIG_A){
00298 rx_rbs_bits = WAN_RBS_SIG_B;
00299 }else{
00300 rx_rbs_bits = WAN_RBS_SIG_A;
00301 }
00302 printf("Writing RBS bits (0x%X)...\n", rx_rbs_bits);
00303 sangoma_tdm_write_rbs(dev_fd, &tdm_api,
00304 chan->channo,
00305 rx_rbs_bits);
00306 }
00307
00308
00309 if(files_used & RX_FILE_USED){
00310 write_data_to_file(rx_buffer, Rx_lgth);
00311 }
00312
00313 return 0;
00314 }
00315
00325 int write_data(uint32_t dev_index, wp_api_hdr_t *tx_hdr, void *tx_buffer, int tx_len)
00326 {
00327 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[dev_index]);
00328 sangoma_chan_t *chan = sangoma_wait_obj_get_context(sangoma_wait_objects[dev_index]);
00329 int err;
00330 static int Tx_count = 0;
00331
00332 if (hdlc_repeat) {
00333 if (verbose){
00334 printf("Repeating Frame\n");
00335 }
00336 tx_hdr->wp_api_tx_hdr_hdlc_rpt_len=4;
00337 memset(tx_hdr->wp_api_tx_hdr_hdlc_rpt_data,Tx_count,4);
00338 }
00339
00340
00341 err = sangoma_writemsg(
00342 dev_fd,
00343 tx_hdr,
00344 sizeof(wp_api_hdr_t),
00345 tx_buffer,
00346 tx_len,
00347 0);
00348
00349 if (err <= 0){
00350 printf("Span: %d, Chan: %d: Failed to send %s!\n",
00351 chan->spanno,
00352 chan->channo, strerror(errno));
00353 return -1;
00354 }
00355
00356 Tx_count++;
00357 if (verbose){
00358 printf("Packet sent: counter: %i, len: %i, errors %i\n", Tx_count, err, tx_hdr->wp_api_tx_hdr_errors);
00359 }else{
00360 if(Tx_count && (!(Tx_count % 1000))){
00361 printf("Packet sent: counter: %i, len: %i\n", Tx_count, err);
00362 }
00363 }
00364
00365 if (tx_delay) {
00366 sangoma_msleep(tx_delay);
00367 }
00368
00369 #if 1
00370 if(tx_cnt && Tx_count >= tx_cnt){
00371 write_enable=0;
00372 printf("Disabling POLLOUT...\n");
00373
00374
00375
00376
00377 return 0;
00378 }
00379 #endif
00380 return 0;
00381 }
00382
00391 int handle_data(uint32_t dev_index, int flags_out)
00392 {
00393 wp_api_hdr_t rxhdr;
00394 int err=0;
00395
00396 memset(&rxhdr, 0, sizeof(rxhdr));
00397
00398 #if 0
00399 printf("%s(): span: %d, chan: %d\n", __FUNCTION__,
00400 sangoma_wait_objects[dev_index].span, sangoma_wait_objects[dev_index].chan);
00401 #endif
00402
00403 if(flags_out & POLLIN){
00404 if(read_data(dev_index, &rxhdr, rxdata, MAX_NO_DATA_BYTES_IN_FRAME) == 0){
00405 if(rx2tx){
00406
00407 return write_data(dev_index, &rxhdr, rxdata,rxhdr.data_length);
00408 }
00409 }
00410 }
00411
00412 if( (flags_out & POLLOUT) && write_enable ){
00413
00414 wp_api_hdr_t txhdr;
00415 static unsigned char tx_test_byte = 2;
00416
00417 memset(&txhdr, 0, sizeof(txhdr));
00418 txhdr.data_length = (unsigned short)tx_size;
00419
00420
00421 memset(txdata, tx_test_byte, txhdr.data_length);
00422
00423 err = write_data(dev_index, &txhdr, txdata, tx_size);
00424 if (err== 0) {
00425
00426 }
00427 }
00428 return err;
00429 }
00430
00436 static void decode_api_event(wp_api_event_t *wp_tdm_api_event)
00437 {
00438 printf("%s(): span: %d, chan: %d\n", __FUNCTION__,
00439 wp_tdm_api_event->span, wp_tdm_api_event->channel);
00440
00441 switch(wp_tdm_api_event->wp_api_event_type)
00442 {
00443 case WP_API_EVENT_DTMF:
00444 printf("DTMF Event: Channel: %d, Digit: %c (Port: %s, Type:%s)!\n",
00445 wp_tdm_api_event->channel,
00446 wp_tdm_api_event->wp_api_event_dtmf_digit,
00447 (wp_tdm_api_event->wp_api_event_dtmf_port == WAN_EC_CHANNEL_PORT_ROUT)?"ROUT":"SOUT",
00448 (wp_tdm_api_event->wp_api_event_dtmf_type == WAN_EC_TONE_PRESENT)?"PRESENT":"STOP");
00449 break;
00450
00451 case WP_API_EVENT_RXHOOK:
00452 printf("RXHOOK Event: Channel: %d, %s! (0x%X)\n",
00453 wp_tdm_api_event->channel,
00454 WAN_EVENT_RXHOOK_DECODE(wp_tdm_api_event->wp_api_event_hook_state),
00455 wp_tdm_api_event->wp_api_event_hook_state);
00456 break;
00457
00458 case WP_API_EVENT_RING_DETECT:
00459 printf("RING Event: %s! (0x%X)\n",
00460 WAN_EVENT_RING_DECODE(wp_tdm_api_event->wp_api_event_ring_state),
00461 wp_tdm_api_event->wp_api_event_ring_state);
00462 break;
00463
00464 case WP_API_EVENT_RING_TRIP_DETECT:
00465 printf("RING TRIP Event: %s! (0x%X)\n",
00466 WAN_EVENT_RING_TRIP_DECODE(wp_tdm_api_event->wp_api_event_ring_state),
00467 wp_tdm_api_event->wp_api_event_ring_state);
00468 break;
00469
00470 case WP_API_EVENT_RBS:
00471 printf("RBS Event: Channel: %d, 0x%X!\n",
00472 wp_tdm_api_event->channel,
00473 wp_tdm_api_event->wp_api_event_rbs_bits);
00474 printf( "RX RBS: A:%1d B:%1d C:%1d D:%1d\n",
00475 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_A) ? 1 : 0,
00476 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_B) ? 1 : 0,
00477 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_C) ? 1 : 0,
00478 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_D) ? 1 : 0);
00479 break;
00480
00481 case WP_API_EVENT_LINK_STATUS:
00482 printf("Link Status Event: %s! (0x%X)\n",
00483 WAN_EVENT_LINK_STATUS_DECODE(wp_tdm_api_event->wp_api_event_link_status),
00484 wp_tdm_api_event->wp_api_event_link_status);
00485 break;
00486
00487 case WP_API_EVENT_ALARM:
00488 printf("New Alarm State: %s! (0x%X)\n", (wp_tdm_api_event->wp_api_event_alarm == 0?"Off":"On"),
00489 wp_tdm_api_event->wp_api_event_alarm);
00490 break;
00491
00492 case WP_API_EVENT_POLARITY_REVERSE:
00493 printf("Polarity Reversal Event : %s! (0x%X)\n",
00494 WP_API_EVENT_POLARITY_REVERSE_DECODE(wp_tdm_api_event->wp_api_event_polarity_reverse),
00495 wp_tdm_api_event->wp_api_event_polarity_reverse);
00496 break;
00497
00498 default:
00499 printf("Unknown TDM API Event: %d\n", wp_tdm_api_event->wp_api_event_type);
00500 break;
00501 }
00502 }
00503
00513 int handle_tdm_event(uint32_t dev_index)
00514 {
00515 wanpipe_api_t tdm_api;
00516 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[dev_index]);
00517
00518 #if 0
00519 printf("%s(): dev_index: %d, dev_fd: 0x%p\n", __FUNCTION__, dev_index, dev_fd);
00520 #endif
00521
00522 memset(&tdm_api, 0x00, sizeof(tdm_api));
00523
00524 if(sangoma_read_event(dev_fd, &tdm_api)){
00525 return 1;
00526 }
00527
00528 decode_api_event(&tdm_api.wp_cmd.event);
00529 return 0;
00530 }
00531
00532
00533 int handle_fe_rw (void)
00534 {
00535 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[0]);
00536 uint8_t data=0;
00537 int err;
00538
00539 if (fe_read_cmd) {
00540 err=sangoma_fe_reg_read(dev_fd,fe_read_reg,&data);
00541 if (err) {
00542 fprintf(stderr,"Error, sangoma_fe_reg_read failed %i\n",err);
00543 return err;
00544 }
00545
00546 printf("FE READ Reg=0x%04X Data=%02X\n", fe_read_reg,data);
00547 }
00548
00549 if (fe_write_cmd) {
00550
00551 printf("FE WRITE Reg=0x%04X Data=%02X\n", fe_write_reg,fe_write_data);
00552
00553 err=sangoma_fe_reg_write(dev_fd,fe_write_reg,fe_write_data);
00554 if (err) {
00555 fprintf(stderr,"Error, sangoma_fe_reg_write failed %i\n",err);
00556 return err;
00557 }
00558
00559 }
00560
00561 return 0;
00562 }
00563
00564
00576 void handle_span_chan(int open_device_counter)
00577 {
00578 int iResult, i;
00579 u_int32_t input_flags[TEST_NUMBER_OF_OBJECTS];
00580 u_int32_t output_flags[TEST_NUMBER_OF_OBJECTS];
00581
00582 printf("\n\nSpan/Chan Handler: RxEnable=%s, TxEnable=%s, TxCnt=%i, TxLen=%i, rx2tx=%s\n",
00583 (read_enable? "Yes":"No"), (write_enable?"Yes":"No"),tx_cnt,tx_size, (rx2tx?"Yes":"No"));
00584
00585 for (i = 0; i < open_device_counter; i++) {
00586 input_flags[i] = poll_events_bitmap;
00587 }
00588
00589
00590 while(!application_termination_flag)
00591 {
00592 iResult = sangoma_waitfor_many(sangoma_wait_objects,
00593 input_flags,
00594 output_flags,
00595 open_device_counter ,
00596 5000 );
00597 switch(iResult)
00598 {
00599 case SANG_STATUS_APIPOLL_TIMEOUT:
00600
00601 {
00602 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[0]);
00603 sangoma_print_stats(dev_fd);
00604 }
00605 printf("Timeout\n");
00606 continue;
00607
00608 case SANG_STATUS_SUCCESS:
00609 for(i = 0; i < open_device_counter; i++){
00610
00611
00612 if(output_flags[i] & POLLPRI){
00613
00614 if(handle_tdm_event(i)){
00615 printf("Error in handle_tdm_event()!\n");
00616 application_termination_flag=1;
00617 break;
00618 }
00619 }
00620
00621 if(output_flags[i] & (POLLIN | POLLOUT)){
00622
00623 if(handle_data(i, output_flags[i])){
00624 printf("Error in handle_data()!\n");
00625
00626 break;
00627 }
00628 }
00629 }
00630 break;
00631
00632 default:
00633
00634 printf("Error: iResult: %s (%d)\n", SDLA_DECODE_SANG_STATUS(iResult), iResult);
00635 return;
00636 }
00637
00638 }
00639 }
00640
00649 int write_data_to_file(unsigned char *data, unsigned int data_length)
00650 {
00651 if(pRxFile == NULL){
00652 return 1;
00653 }
00654
00655 return fwrite(data, 1, data_length, pRxFile);
00656 }
00657
00658 #ifdef __WINDOWS__
00659
00660
00661
00662
00663
00664 BOOL TerminateHandler(DWORD dwCtrlType)
00665 {
00666 printf("\nProcess terminated by user request.\n");
00667 application_termination_flag = 1;
00668
00669 cleanup();
00670
00671 return FALSE;
00672 }
00673 #else
00674
00679 void TerminateHandler (int sig)
00680 {
00681 printf("\nProcess terminated by user request.\n");
00682 application_termination_flag = 1;
00683
00684 cleanup();
00685 return;
00686 }
00687
00688 #endif
00689
00697 void cleanup()
00698 {
00699 int dev_no;
00700 sng_fd_t fd;
00701 sangoma_chan_t *chan;
00702 sangoma_wait_obj_t *sng_wait_object;
00703 wanpipe_api_t tdm_api;
00704
00705
00706 for(dev_no = 0; dev_no < TEST_NUMBER_OF_OBJECTS; dev_no++){
00707
00708 sng_wait_object = sangoma_wait_objects[dev_no];
00709 if(!sng_wait_object){
00710 continue;
00711 }
00712 chan = sangoma_wait_obj_get_context(sng_wait_object);
00713 printf("%s(): span: %d, chan: %d ...\n", __FUNCTION__,
00714 chan->channo,
00715 chan->spanno);
00716
00717 fd = sangoma_wait_obj_get_fd(sng_wait_object);
00718 memset(&tdm_api, 0x00, sizeof(tdm_api));
00719
00720 if(dtmf_enable_octasic == 1){
00721
00722 sangoma_tdm_disable_dtmf_events(fd, &tdm_api);
00723 }
00724
00725 if(dtmf_enable_remora == 1){
00726
00727 sangoma_tdm_disable_rm_dtmf_events(fd, &tdm_api);
00728 }
00729
00730 if(remora_hook == 1){
00731 sangoma_tdm_disable_rxhook_events(fd, &tdm_api);
00732 }
00733
00734 if(rbs_events == 1){
00735 sangoma_tdm_disable_rbs_events(fd, &tdm_api);
00736 }
00737
00738 sangoma_wait_obj_delete(&sng_wait_object);
00739
00740 sangoma_close(&fd);
00741
00742 }
00743 }
00744
00745
00760 int open_sangoma_device()
00761 {
00762 int span, chan, err = 0, open_dev_cnt = 0;
00763 sangoma_status_t status;
00764 sng_fd_t dev_fd = INVALID_HANDLE_VALUE;
00765 wanpipe_api_t tdm_api;
00766
00767 span = wanpipe_port_no;
00768 chan = wanpipe_if_no;
00769
00770
00771 dev_fd = sangoma_open_api_span_chan(span, chan);
00772 if( dev_fd == INVALID_HANDLE_VALUE){
00773 printf("Warning: Failed to open span %d, chan %d\n", span , chan);
00774 return 1;
00775 }else{
00776 printf("Successfuly opened span %d, chan %d\n", span , chan);
00777 }
00778
00779 memset(&tdm_api, 0x00, sizeof(tdm_api));
00780
00781 status = sangoma_wait_obj_create(&sangoma_wait_objects[open_dev_cnt], dev_fd, SANGOMA_DEVICE_WAIT_OBJ);
00782 if(status != SANG_STATUS_SUCCESS){
00783 printf("Error: Failed to create 'sangoma_wait_object'!\n");
00784 return 1;
00785 }
00786 sangoma_channels[open_dev_cnt].channo = chan;
00787 sangoma_channels[open_dev_cnt].spanno = span;
00788 sangoma_wait_obj_set_context(sangoma_wait_objects[open_dev_cnt], &sangoma_channels[open_dev_cnt]);
00789
00790
00791 if((err = sangoma_get_full_cfg(dev_fd, &tdm_api))){
00792 return 1;
00793 }
00794
00795 if(set_codec_slinear){
00796 printf("Setting SLINEAR codec\n");
00797 if((err=sangoma_tdm_set_codec(dev_fd, &tdm_api, WP_SLINEAR))){
00798 return 1;
00799 }
00800 }
00801
00802 if(set_codec_none){
00803 printf("Disabling codec\n");
00804 if((err=sangoma_tdm_set_codec(dev_fd, &tdm_api, WP_NONE))){
00805 return 1;
00806 }
00807 }
00808
00809 if(usr_period){
00810 printf("Setting user period: %d\n", usr_period);
00811 if((err=sangoma_tdm_set_usr_period(dev_fd, &tdm_api, usr_period))){
00812 return 1;
00813 }
00814 }
00815
00816 if (rx_gain_cmd) {
00817 printf("Setting rx gain : %f\n", rx_gain);
00818 if (sangoma_set_rx_gain(dev_fd,&tdm_api,rx_gain)) {
00819 return 1;
00820 }
00821 }
00822
00823 if (tx_gain_cmd) {
00824 printf("Setting tx gain : %f\n", rx_gain);
00825 if (sangoma_set_tx_gain(dev_fd,&tdm_api,tx_gain)) {
00826 return 1;
00827 }
00828 }
00829
00830 if(set_codec_slinear || usr_period || set_codec_none){
00831
00832 if((err=sangoma_get_full_cfg(dev_fd, &tdm_api))){
00833 return 1;
00834 }
00835 }
00836
00837 if(dtmf_enable_octasic == 1){
00838 poll_events_bitmap |= POLLPRI;
00839
00840 if((err=sangoma_tdm_enable_dtmf_events(dev_fd, &tdm_api))){
00841 return 1;
00842 }
00843 }
00844
00845 if(dtmf_enable_remora == 1){
00846 poll_events_bitmap |= POLLPRI;
00847
00848 if((err=sangoma_tdm_enable_rm_dtmf_events(dev_fd, &tdm_api))){
00849 return 1;
00850 }
00851 }
00852
00853 if(remora_hook == 1){
00854 poll_events_bitmap |= POLLPRI;
00855 if((err=sangoma_tdm_enable_rxhook_events(dev_fd, &tdm_api))){
00856 return 1;
00857 }
00858 }
00859
00860 if(rbs_events == 1){
00861 poll_events_bitmap |= POLLPRI;
00862 if((err=sangoma_tdm_enable_rbs_events(dev_fd, &tdm_api, 20))){
00863 return 1;
00864 }
00865 }
00866 if (buffer_multiplier) {
00867 printf("Setting buffer multiplier to %i\n",buffer_multiplier);
00868 err=sangoma_tdm_set_buffer_multiplier(dev_fd,&tdm_api,buffer_multiplier);
00869 if (err) {
00870 return 1;
00871 }
00872 }
00873
00874 printf("Device Config RxQ=%i TxQ=%i \n",
00875 sangoma_get_rx_queue_sz(dev_fd,&tdm_api),
00876 sangoma_get_rx_queue_sz(dev_fd,&tdm_api));
00877
00878 #if 0
00879 sangoma_set_rx_queue_sz(dev_fd,&tdm_api,20);
00880 sangoma_set_tx_queue_sz(dev_fd,&tdm_api,30);
00881 #endif
00882
00883 printf("Device Config RxQ=%i TxQ=%i \n",
00884 sangoma_get_rx_queue_sz(dev_fd,&tdm_api),
00885 sangoma_get_tx_queue_sz(dev_fd,&tdm_api));
00886
00887 sangoma_flush_bufs(dev_fd,&tdm_api);
00888
00889 sangoma_print_stats(dev_fd);
00890
00891
00892 return err;
00893 }
00894
00895
00896 static int sangoma_hardware_rescan(void)
00897 {
00898
00899 #ifdef WP_API_FEATURE_HARDWARE_RESCAN
00900 int err;
00901 int cnt;
00902 port_management_struct_t port;
00903 sng_fd_t fd = sangoma_open_driver_ctrl(1);
00904 if (fd == INVALID_HANDLE_VALUE) {
00905 printf("Hardware Rescan failed to open driver ctrl\n");
00906 return -1;
00907 }
00908
00909 memset(&port,0,sizeof(port));
00910
00911 err=sangoma_driver_hw_rescan(fd,&port,&cnt);
00912 if (err < 0) {
00913 printf("Hardware Rescan error %i\n",err);
00914 return err;
00915 }
00916
00917 printf("Hardware Rescan %i\n",cnt);
00918
00919 sangoma_close(&fd);
00920
00921 #endif
00922
00923 return err;
00924 }
00925
00926
00933 int __cdecl main(int argc, char* argv[])
00934 {
00935 int proceed, i;
00936
00937 #if 0
00938
00939
00940
00941
00942 sangoma_hardware_rescan();
00943 #endif
00944
00945 proceed=init_args(argc,argv);
00946 if (proceed != WAN_TRUE){
00947 usage(argv[0]);
00948 return -1;
00949 }
00950
00951
00952 #if defined(__WINDOWS__)
00953 if (!SetConsoleCtrlHandler(TerminateHandler, TRUE)) {
00954 printf("ERROR : Unable to register terminate handler ( %d ).\nProcess terminated.\n",
00955 GetLastError());
00956 return -1;
00957 }
00958 #else
00959 signal(SIGHUP,TerminateHandler);
00960 signal(SIGTERM,TerminateHandler);
00961 #endif
00962
00963 for(i = 0; i < TEST_NUMBER_OF_OBJECTS; i++){
00964 sangoma_wait_objects[i] = NULL;
00965 }
00966
00967 poll_events_bitmap = 0;
00968 if(read_enable == 1){
00969 poll_events_bitmap |= POLLIN;
00970 }
00971
00972 if(write_enable == 1 && rx2tx == 1){
00973
00974
00975 write_enable = 0;
00976 }
00977
00978 if(write_enable == 1){
00979 poll_events_bitmap |= POLLOUT;
00980 }
00981
00982
00983 poll_events_bitmap |= (POLLHUP | POLLPRI);
00984 #if defined(__WINDOWS__)
00985 printf("Enabling Poll Events:\n");
00986 print_poll_event_bitmap(poll_events_bitmap);
00987 #endif
00988 printf("Connecting to Port/Span: %d, Interface/Chan: %d\n",
00989 wanpipe_port_no, wanpipe_if_no);
00990
00991
00992 if(open_sangoma_device()){
00993 return -1;
00994 }
00995
00996 printf("********************************\n");
00997 printf("files_used: 0x%x\n", files_used);
00998 printf("********************************\n");
00999 if(files_used & RX_FILE_USED){
01000 pRxFile = fopen( (const char*)&rx_file[0], "wb" );
01001 if(pRxFile == NULL){
01002 printf("Can't open Rx file: [%s]!!\n", rx_file);
01003 }else{
01004 printf("Open Rx file: %s. OK.\n", rx_file);
01005 }
01006 }
01007
01008 if (fe_read_cmd || fe_write_cmd) {
01009 handle_fe_rw();
01010 goto done;
01011 }
01012
01013 handle_span_chan(1 );
01014
01015 done:
01016
01017 cleanup();
01018
01019 printf("\nSample application exiting.(press any key)\n");
01020 _getch();
01021 return 0;
01022 }