sample.c

Go to the documentation of this file.
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 /* This example application has only a single execution thread - it is safe
00055  * to use a global buffer for received data and for data to be transmitted. */
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 /* Warning: non-thread safe globals. Ok for this single-thread example but not in production. */
00066 unsigned char rx_rbs_bits = WAN_RBS_SIG_A;
00067 FILE    *pRxFile;
00068 int     application_termination_flag = 0;
00069 
00070 /*****************************************************************
00071  * Prototypes
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  * General Functions
00097  *****************************************************************/
00098 
00106 void print_rxdata(unsigned char *data, int  datalen); /* dont remove prototype, gcc complains */
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         /* don't print too much!! */
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     /* read the message */
00151     Rx_lgth = sangoma_readmsg(
00152                     dev_fd,
00153                     rx_hdr,                 /* header buffer */
00154                     sizeof(wp_api_hdr_t),   /* header size */
00155                     rx_buffer,              /* data buffer */
00156                     rx_buffer_length,       /* data BUFFER size */
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     /* use Rx_counter as "write" events trigger: */
00169     if(rbs_events == 1 && (Rx_count % 400) == 0){
00170         /*  bitmap - set as needed: WAN_RBS_SIG_A | WAN_RBS_SIG_B | WAN_RBS_SIG_C | WAN_RBS_SIG_D;
00171         
00172             In this example make bits A and B to change each time,
00173             so it's easy to see the change on the receiving side.
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     /* if user needs Rx data to be written into a file: */
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     /* write a message */
00210     err = sangoma_writemsg(
00211                 dev_fd,
00212                 tx_hdr,                 /* header buffer */
00213                 sizeof(wp_api_hdr_t),   /* header size */
00214                 tx_buffer,              /* data buffer */
00215                 tx_hdr->data_length,    /* DATA size */
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         /* No need for POLLOUT, turn it off!! If not turned off, and we
00239          * have nothing for transmission, sangoma_socket_waitfor() will return
00240          * immediately, creating a busy loop. */
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                 /* Send back received data (create a "software loopback"), just a test. */
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;/* use '-txsize' command line option to change 'tx_size' */
00282 
00283         /* set data which will be transmitted */
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:/* DTMF detected by Hardware */
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     /* Main Rx/Tx/Event loop */
00419     while(!application_termination_flag) 
00420     {   
00421         iResult = sangoma_waitfor_many(sangoma_wait_objects, 
00422                            input_flags,
00423                            output_flags,
00424                            open_device_counter /* number of wait objects */,
00425                            2000 /* wait timeout, in milliseconds */);
00426         switch(iResult)
00427         {
00428         case SANG_STATUS_APIPOLL_TIMEOUT:
00429             /* timeout (not an error) */
00430             printf("Timeout\n");
00431             continue;
00432 
00433         case SANG_STATUS_SUCCESS:
00434             for(i = 0; i < open_device_counter; i++){
00435 
00436                 /* a wait object was signaled */
00437                 if(output_flags[i] & POLLPRI){
00438                     /* got tdm api event */
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                     /* rx data OR a free tx buffer available */
00446                     if(handle_data(i, output_flags[i])){
00447                         printf("Error in handle_data()!\n");
00448                     }
00449                 }
00450             }/* for() */
00451             break;
00452 
00453         default:
00454             /* error */
00455             printf("Error: iResult: %s (%d)\n", SDLA_DECODE_SANG_STATUS(iResult), iResult);
00456             return;
00457         }
00458 
00459     }/* while() */
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  * TerminateHandler() - this handler is called by the system whenever user tries to terminate
00482  *                      the process with Ctrl+C, Ctrl+Break or closes the console window.
00483  *                      Perform a clean-up here.
00484  */
00485 BOOL TerminateHandler(DWORD dwCtrlType)
00486 {
00487     printf("\nProcess terminated by user request.\n");
00488     application_termination_flag = 1;
00489     /* do the cleanup before exiting: */
00490     cleanup();
00491     /* return FALSE so the system will call the dafult handler which will terminate the process. */
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     /* do the cleanup before exiting: */
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     /* do the cleanup before exiting: */
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             /* Disable dtmf detection on Octasic chip */
00543             sangoma_tdm_disable_dtmf_events(fd, &tdm_api);
00544         }
00545 
00546         if(dtmf_enable_remora == 1){
00547             /* Disable dtmf detection on Sangoma's Remora SLIC chip */
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     /* span and chan are 1-based */
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     /* open_dev_cnt++; */
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         /* display new configuration AFTER it was changed */
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         /* enable dtmf detection on Octasic chip */
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         /* enable dtmf detection on Sangoma's Remora SLIC chip (A200 ONLY) */
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     /* register Ctrl+C handler - we want a clean termination */
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         /* These two options are mutually exclusive because 'rx2tx' option
00727          * indicates "use Reciever as the timing source for Transmitter". */
00728         write_enable = 0;
00729     }
00730     
00731     if(write_enable == 1){
00732         poll_events_bitmap |= POLLOUT;
00733     }
00734 
00735     /* Front End connect/disconnect, and other events, such as DTMF... */
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 /* handle a single device */);
00762 
00763     /* returned from main loop, do the cleanup before exiting: */
00764     cleanup();
00765 
00766     printf("\nSample application exiting.(press any key)\n");
00767     _getch();
00768     return 0;
00769 }

Generated on Fri Jun 26 12:46:14 2009 for libsangoma by  doxygen 1.4.7