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 void *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);
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 void cleanup(void);
00088
00089 #ifdef __WINDOWS__
00090 BOOL TerminateHandler(DWORD dwCtrlType);
00091 #else
00092 void TerminateHandler(int);
00093 #endif
00094
00095
00096
00097
00098
00106 void print_rxdata(unsigned char *data, int datalen);
00107 void print_rxdata(unsigned char *data, int datalen)
00108 {
00109 int i;
00110
00111 printf("Data: (Len=%i)\n",datalen);
00112 for(i = 0; i < datalen; i++) {
00113 if((i % 20 == 0)){
00114 if(i){
00115 printf("\n");
00116 }
00117 }
00118 printf("%02X ", data[i]);
00119 #if 0
00120
00121 if(i > 100){
00122 printf("...\n");
00123 break;
00124 }
00125 #endif
00126 }
00127 printf("\n");
00128 }
00129
00139 int read_data(uint32_t dev_index, wp_api_hdr_t *rx_hdr, void *rx_buffer, int rx_buffer_length)
00140 {
00141 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[dev_index]);
00142 sangoma_chan_t *chan = sangoma_wait_obj_get_context(sangoma_wait_objects[dev_index]);
00143 int Rx_lgth = 0;
00144 static int Rx_count= 0;
00145 wanpipe_api_t tdm_api;
00146
00147 memset(&tdm_api, 0x00, sizeof(tdm_api));
00148 memset(rx_hdr, 0, sizeof(wp_api_hdr_t));
00149
00150
00151 Rx_lgth = sangoma_readmsg(
00152 dev_fd,
00153 rx_hdr,
00154 sizeof(wp_api_hdr_t),
00155 rx_buffer,
00156 rx_buffer_length,
00157 0);
00158 if(Rx_lgth <= 0) {
00159 printf("Span: %d, Chan: %d: Error receiving data!\n",
00160 chan->spanno, chan->channo);
00161 return 1;
00162 }
00163
00164 if (verbose){
00165 print_rxdata(rx_buffer, Rx_lgth);
00166 }
00167
00168
00169 if(rbs_events == 1 && (Rx_count % 400) == 0){
00170
00171
00172
00173
00174
00175 if(rx_rbs_bits == WAN_RBS_SIG_A){
00176 rx_rbs_bits = WAN_RBS_SIG_B;
00177 }else{
00178 rx_rbs_bits = WAN_RBS_SIG_A;
00179 }
00180 printf("Writing RBS bits (0x%X)...\n", rx_rbs_bits);
00181 sangoma_tdm_write_rbs(dev_fd, &tdm_api,
00182 chan->channo,
00183 rx_rbs_bits);
00184 }
00185
00186
00187 if(files_used & RX_FILE_USED){
00188 write_data_to_file(rx_buffer, Rx_lgth);
00189 }
00190
00191 return 0;
00192 }
00193
00202 int write_data(uint32_t dev_index, wp_api_hdr_t *tx_hdr, void *tx_buffer)
00203 {
00204 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[dev_index]);
00205 sangoma_chan_t *chan = sangoma_wait_obj_get_context(sangoma_wait_objects[dev_index]);
00206 int err;
00207 static int Tx_count = 0;
00208
00209
00210 err = sangoma_writemsg(
00211 dev_fd,
00212 tx_hdr,
00213 sizeof(wp_api_hdr_t),
00214 tx_buffer,
00215 tx_hdr->data_length,
00216 0);
00217
00218 if (err <= 0){
00219 printf("Span: %d, Chan: %d: Failed to send!\n",
00220 chan->spanno,
00221 chan->channo);
00222 return -1;
00223 }
00224
00225 Tx_count++;
00226 if (verbose){
00227 printf("Packet sent: counter: %i, len: %i\n", Tx_count, err);
00228 }else{
00229 if(Tx_count && (!(Tx_count % 1000))){
00230 printf("Packet sent: counter: %i, len: %i\n", Tx_count, err);
00231 }
00232 }
00233
00234 #if 0
00235 if(Tx_count >= tx_cnt){
00236 write_enable=0;
00237 printf("Disabling POLLOUT...\n");
00238
00239
00240
00241 sangoma_wait_objects[dev_index].flags_in &= (~POLLOUT);
00242 }
00243 #endif
00244 return 0;
00245 }
00246
00255 int handle_data(uint32_t dev_index, int flags_out)
00256 {
00257 wp_api_hdr_t rxhdr;
00258
00259 memset(&rxhdr, 0, sizeof(rxhdr));
00260
00261 #if 0
00262 printf("%s(): span: %d, chan: %d\n", __FUNCTION__,
00263 sangoma_wait_objects[dev_index].span, sangoma_wait_objects[dev_index].chan);
00264 #endif
00265
00266 if(flags_out & POLLIN){
00267 if(read_data(dev_index, &rxhdr, rxdata, MAX_NO_DATA_BYTES_IN_FRAME) == 0){
00268 if(rx2tx){
00269
00270 return write_data(dev_index, &rxhdr, rxdata);
00271 }
00272 }
00273 }
00274
00275 if( (flags_out & POLLOUT) && write_enable ){
00276
00277 wp_api_hdr_t txhdr;
00278 static unsigned char tx_test_byte = 0;
00279
00280 memset(&txhdr, 0, sizeof(txhdr));
00281 txhdr.data_length = (unsigned short)tx_size;
00282
00283
00284 memset(txdata, tx_test_byte, txhdr.data_length);
00285
00286 if(write_data(dev_index, &txhdr, txdata) == 0){
00287 tx_test_byte++;
00288 }
00289 }
00290 return 0;
00291 }
00292
00298 static void decode_api_event(wp_api_event_t *wp_tdm_api_event)
00299 {
00300 printf("%s(): span: %d, chan: %d\n", __FUNCTION__,
00301 wp_tdm_api_event->span, wp_tdm_api_event->channel);
00302
00303 switch(wp_tdm_api_event->wp_api_event_type)
00304 {
00305 case WP_API_EVENT_DTMF:
00306 printf("DTMF Event: Channel: %d, Digit: %c (Port: %s, Type:%s)!\n",
00307 wp_tdm_api_event->channel,
00308 wp_tdm_api_event->wp_api_event_dtmf_digit,
00309 (wp_tdm_api_event->wp_api_event_dtmf_port == WAN_EC_CHANNEL_PORT_ROUT)?"ROUT":"SOUT",
00310 (wp_tdm_api_event->wp_api_event_dtmf_type == WAN_EC_TONE_PRESENT)?"PRESENT":"STOP");
00311 break;
00312
00313 case WP_API_EVENT_RXHOOK:
00314 printf("RXHOOK Event: Channel: %d, %s! (0x%X)\n",
00315 wp_tdm_api_event->channel,
00316 WAN_EVENT_RXHOOK_DECODE(wp_tdm_api_event->wp_api_event_hook_state),
00317 wp_tdm_api_event->wp_api_event_hook_state);
00318 break;
00319
00320 case WP_API_EVENT_RING_DETECT:
00321 printf("RING Event: %s! (0x%X)\n",
00322 WAN_EVENT_RING_DECODE(wp_tdm_api_event->wp_api_event_ring_state),
00323 wp_tdm_api_event->wp_api_event_ring_state);
00324 break;
00325
00326 case WP_API_EVENT_RING_TRIP_DETECT:
00327 printf("RING TRIP Event: %s! (0x%X)\n",
00328 WAN_EVENT_RING_TRIP_DECODE(wp_tdm_api_event->wp_api_event_ring_state),
00329 wp_tdm_api_event->wp_api_event_ring_state);
00330 break;
00331
00332 case WP_API_EVENT_RBS:
00333 printf("RBS Event: Channel: %d, 0x%X!\n",
00334 wp_tdm_api_event->channel,
00335 wp_tdm_api_event->wp_api_event_rbs_bits);
00336 printf( "RX RBS: A:%1d B:%1d C:%1d D:%1d\n",
00337 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_A) ? 1 : 0,
00338 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_B) ? 1 : 0,
00339 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_C) ? 1 : 0,
00340 (wp_tdm_api_event->wp_api_event_rbs_bits & WAN_RBS_SIG_D) ? 1 : 0);
00341 break;
00342
00343 case WP_API_EVENT_LINK_STATUS:
00344 printf("Link Status Event: %s! (0x%X)\n",
00345 WAN_EVENT_LINK_STATUS_DECODE(wp_tdm_api_event->wp_api_event_link_status),
00346 wp_tdm_api_event->wp_api_event_link_status);
00347 break;
00348
00349 case WP_API_EVENT_ALARM:
00350 printf("New Alarm State: %s! (0x%X)\n", (wp_tdm_api_event->wp_api_event_alarm == 0?"Off":"On"),
00351 wp_tdm_api_event->wp_api_event_alarm);
00352 break;
00353
00354 case WP_API_EVENT_POLARITY_REVERSE:
00355 printf("Polarity Reversal Event : %s! (0x%X)\n",
00356 WP_API_EVENT_POLARITY_REVERSE_DECODE(wp_tdm_api_event->wp_api_event_polarity_reverse),
00357 wp_tdm_api_event->wp_api_event_polarity_reverse);
00358 break;
00359
00360 default:
00361 printf("Unknown TDM API Event: %d\n", wp_tdm_api_event->wp_api_event_type);
00362 break;
00363 }
00364 }
00365
00375 int handle_tdm_event(uint32_t dev_index)
00376 {
00377 wanpipe_api_t tdm_api;
00378 sng_fd_t dev_fd = sangoma_wait_obj_get_fd(sangoma_wait_objects[dev_index]);
00379
00380 #if 0
00381 printf("%s(): dev_index: %d, dev_fd: 0x%p\n", __FUNCTION__, dev_index, dev_fd);
00382 #endif
00383
00384 memset(&tdm_api, 0x00, sizeof(tdm_api));
00385
00386 if(sangoma_read_event(dev_fd, &tdm_api)){
00387 return 1;
00388 }
00389
00390 decode_api_event(&tdm_api.wp_cmd.event);
00391 return 0;
00392 }
00393
00405 void handle_span_chan(int open_device_counter)
00406 {
00407 int iResult, i;
00408 u_int32_t input_flags[TEST_NUMBER_OF_OBJECTS];
00409 u_int32_t output_flags[TEST_NUMBER_OF_OBJECTS];
00410
00411 printf("\n\nSpan/Chan Handler: RxEnable=%s, TxEnable=%s, TxCnt=%i, TxLen=%i, rx2tx=%s\n",
00412 (read_enable? "Yes":"No"), (write_enable?"Yes":"No"),tx_cnt,tx_size, (rx2tx?"Yes":"No"));
00413
00414 for (i = 0; i < open_device_counter; i++) {
00415 input_flags[i] = poll_events_bitmap;
00416 }
00417
00418
00419 while(!application_termination_flag)
00420 {
00421 iResult = sangoma_waitfor_many(sangoma_wait_objects,
00422 input_flags,
00423 output_flags,
00424 open_device_counter ,
00425 2000 );
00426 switch(iResult)
00427 {
00428 case SANG_STATUS_APIPOLL_TIMEOUT:
00429
00430 printf("Timeout\n");
00431 continue;
00432
00433 case SANG_STATUS_SUCCESS:
00434 for(i = 0; i < open_device_counter; i++){
00435
00436
00437 if(output_flags[i] & POLLPRI){
00438
00439 if(handle_tdm_event(i)){
00440 printf("Error in handle_tdm_event()!\n");
00441 }
00442 }
00443
00444 if(output_flags[i] & (POLLIN | POLLOUT)){
00445
00446 if(handle_data(i, output_flags[i])){
00447 printf("Error in handle_data()!\n");
00448 }
00449 }
00450 }
00451 break;
00452
00453 default:
00454
00455 printf("Error: iResult: %s (%d)\n", SDLA_DECODE_SANG_STATUS(iResult), iResult);
00456 return;
00457 }
00458
00459 }
00460 }
00461
00470 int write_data_to_file(unsigned char *data, unsigned int data_length)
00471 {
00472 if(pRxFile == NULL){
00473 return 1;
00474 }
00475
00476 return fwrite(data, 1, data_length, pRxFile);
00477 }
00478
00479 #ifdef __WINDOWS__
00480
00481
00482
00483
00484
00485 BOOL TerminateHandler(DWORD dwCtrlType)
00486 {
00487 printf("\nProcess terminated by user request.\n");
00488 application_termination_flag = 1;
00489
00490 cleanup();
00491
00492 return FALSE;
00493 }
00494 #else
00495
00500 void TerminateHandler (int sig)
00501 {
00502 printf("\nProcess terminated by user request.\n");
00503 application_termination_flag = 1;
00504
00505 cleanup();
00506 return;
00507 }
00508
00509 #endif
00510
00518 void cleanup()
00519 {
00520 int dev_no;
00521 sng_fd_t fd;
00522 sangoma_chan_t *chan;
00523 sangoma_wait_obj_t *sng_wait_object;
00524 wanpipe_api_t tdm_api;
00525
00526
00527 for(dev_no = 0; dev_no < TEST_NUMBER_OF_OBJECTS; dev_no++){
00528
00529 sng_wait_object = sangoma_wait_objects[dev_no];
00530 if(!sng_wait_object){
00531 continue;
00532 }
00533 chan = sangoma_wait_obj_get_context(sng_wait_object);
00534 printf("%s(): span: %d, chan: %d ...\n", __FUNCTION__,
00535 chan->channo,
00536 chan->spanno);
00537
00538 fd = sangoma_wait_obj_get_fd(sng_wait_object);
00539 memset(&tdm_api, 0x00, sizeof(tdm_api));
00540
00541 if(dtmf_enable_octasic == 1){
00542
00543 sangoma_tdm_disable_dtmf_events(fd, &tdm_api);
00544 }
00545
00546 if(dtmf_enable_remora == 1){
00547
00548 sangoma_tdm_disable_rm_dtmf_events(fd, &tdm_api);
00549 }
00550
00551 if(remora_hook == 1){
00552 sangoma_tdm_disable_rxhook_events(fd, &tdm_api);
00553 }
00554
00555 if(rbs_events == 1){
00556 sangoma_tdm_disable_rbs_events(fd, &tdm_api);
00557 }
00558
00559 sangoma_wait_obj_delete(&sng_wait_object);
00560
00561 sangoma_close(&fd);
00562
00563 }
00564 }
00565
00566
00581 int open_sangoma_device()
00582 {
00583 int span, chan, err = 0, open_dev_cnt = 0;
00584 sangoma_status_t status;
00585 sng_fd_t dev_fd = INVALID_HANDLE_VALUE;
00586 wanpipe_api_t tdm_api;
00587
00588 span = wanpipe_port_no;
00589 chan = wanpipe_if_no;
00590
00591
00592 dev_fd = sangoma_open_api_span_chan(span, chan);
00593 if( dev_fd == INVALID_HANDLE_VALUE){
00594 printf("Warning: Failed to open span %d, chan %d\n", span , chan);
00595 return 1;
00596 }else{
00597 printf("Successfuly opened span %d, chan %d\n", span , chan);
00598 }
00599
00600 memset(&tdm_api, 0x00, sizeof(tdm_api));
00601
00602 status = sangoma_wait_obj_create(&sangoma_wait_objects[open_dev_cnt], dev_fd, SANGOMA_DEVICE_WAIT_OBJ);
00603 if(status != SANG_STATUS_SUCCESS){
00604 printf("Error: Failed to create 'sangoma_wait_object'!\n");
00605 return 1;
00606 }
00607 sangoma_channels[open_dev_cnt].channo = chan;
00608 sangoma_channels[open_dev_cnt].spanno = span;
00609 sangoma_wait_obj_set_context(sangoma_wait_objects[open_dev_cnt], &sangoma_channels[open_dev_cnt]);
00610
00611
00612 if((err = sangoma_get_full_cfg(dev_fd, &tdm_api))){
00613 return 1;
00614 }
00615
00616 if(set_codec_slinear){
00617 printf("Setting SLINEAR codec\n");
00618 if((err=sangoma_tdm_set_codec(dev_fd, &tdm_api, WP_SLINEAR))){
00619 return 1;
00620 }
00621 }
00622
00623 if(set_codec_none){
00624 printf("Disabling codec\n");
00625 if((err=sangoma_tdm_set_codec(dev_fd, &tdm_api, WP_NONE))){
00626 return 1;
00627 }
00628 }
00629
00630 if(usr_period){
00631 printf("Setting user period: %d\n", usr_period);
00632 if((err=sangoma_tdm_set_usr_period(dev_fd, &tdm_api, usr_period))){
00633 return 1;
00634 }
00635 }
00636
00637 if(set_codec_slinear || usr_period || set_codec_none){
00638
00639 if((err=sangoma_get_full_cfg(dev_fd, &tdm_api))){
00640 return 1;
00641 }
00642 }
00643
00644 if(dtmf_enable_octasic == 1){
00645 poll_events_bitmap |= POLLPRI;
00646
00647 if((err=sangoma_tdm_enable_dtmf_events(dev_fd, &tdm_api))){
00648 return 1;
00649 }
00650 }
00651
00652 if(dtmf_enable_remora == 1){
00653 poll_events_bitmap |= POLLPRI;
00654
00655 if((err=sangoma_tdm_enable_rm_dtmf_events(dev_fd, &tdm_api))){
00656 return 1;
00657 }
00658 }
00659
00660 if(remora_hook == 1){
00661 poll_events_bitmap |= POLLPRI;
00662 if((err=sangoma_tdm_enable_rxhook_events(dev_fd, &tdm_api))){
00663 return 1;
00664 }
00665 }
00666
00667 if(rbs_events == 1){
00668 poll_events_bitmap |= POLLPRI;
00669 if((err=sangoma_tdm_enable_rbs_events(dev_fd, &tdm_api, 20))){
00670 return 1;
00671 }
00672 }
00673
00674 printf("Device Config RxQ=%i TxQ=%i \n",
00675 sangoma_get_rx_queue_sz(dev_fd,&tdm_api),
00676 sangoma_get_rx_queue_sz(dev_fd,&tdm_api));
00677
00678 sangoma_set_rx_queue_sz(dev_fd,&tdm_api,20);
00679 sangoma_set_tx_queue_sz(dev_fd,&tdm_api,30);
00680
00681 printf("Device Config RxQ=%i TxQ=%i \n",
00682 sangoma_get_rx_queue_sz(dev_fd,&tdm_api),
00683 sangoma_get_tx_queue_sz(dev_fd,&tdm_api));
00684
00685 return err;
00686 }
00687
00694 int __cdecl main(int argc, char* argv[])
00695 {
00696 int proceed, i;
00697
00698 proceed=init_args(argc,argv);
00699 if (proceed != WAN_TRUE){
00700 usage(argv[0]);
00701 return -1;
00702 }
00703
00704
00705 #if defined(__WINDOWS__)
00706 if (!SetConsoleCtrlHandler(TerminateHandler, TRUE)) {
00707 printf("ERROR : Unable to register terminate handler ( %d ).\nProcess terminated.\n",
00708 GetLastError());
00709 return -1;
00710 }
00711 #else
00712 signal(SIGHUP,TerminateHandler);
00713 signal(SIGTERM,TerminateHandler);
00714 #endif
00715
00716 for(i = 0; i < TEST_NUMBER_OF_OBJECTS; i++){
00717 sangoma_wait_objects[i] = NULL;
00718 }
00719
00720 poll_events_bitmap = 0;
00721 if(read_enable == 1){
00722 poll_events_bitmap |= POLLIN;
00723 }
00724
00725 if(write_enable == 1 && rx2tx == 1){
00726
00727
00728 write_enable = 0;
00729 }
00730
00731 if(write_enable == 1){
00732 poll_events_bitmap |= POLLOUT;
00733 }
00734
00735
00736 poll_events_bitmap |= (POLLHUP | POLLPRI);
00737 #if defined(__WINDOWS__)
00738 printf("Enabling Poll Events:\n");
00739 print_poll_event_bitmap(poll_events_bitmap);
00740 #endif
00741 printf("Connecting to Port/Span: %d, Interface/Chan: %d\n",
00742 wanpipe_port_no, wanpipe_if_no);
00743
00744
00745 if(open_sangoma_device()){
00746 return -1;
00747 }
00748
00749 printf("********************************\n");
00750 printf("files_used: 0x%x\n", files_used);
00751 printf("********************************\n");
00752 if(files_used & RX_FILE_USED){
00753 pRxFile = fopen( (const char*)&rx_file[0], "wb" );
00754 if(pRxFile == NULL){
00755 printf("Can't open Rx file: [%s]!!\n", rx_file);
00756 }else{
00757 printf("Open Rx file: %s. OK.\n", rx_file);
00758 }
00759 }
00760
00761 handle_span_chan(1 );
00762
00763
00764 cleanup();
00765
00766 printf("\nSample application exiting.(press any key)\n");
00767 _getch();
00768 return 0;
00769 }