/* Copyright 2016 Giovanni Franza - HB9EIK This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #define S_RATE 122880000 #define S_RATE_S1 61440000 typedef struct _cbdata_t { int obj; struct libusb_transfer *transfer; float *outbuf; long *freq; int *atten; int *filter; char *sampling; int sockfd; socklen_t salen; struct sockaddr *sa; int *bytes_per_sample; int rescale; } cbdata_t, *cbdata_p; typedef struct _threaddata_t { long *freq; int *atten; int *filter; char *sampling; int port; int *bytes_per_sample; int rescale; } threaddata_t, *threaddata_p; libusb_device_handle *dev_handle=NULL; static int isDuo = 0; static int isS1 = 0; static int isS2 = 0; static float globalOffset, lpOffset, attOffset; static float recalc, rescale; void cb_in( struct libusb_transfer * transfer ) { cbdata_p cbd; int res; int j, k, y; float c; short rs; int ri; short filler; // struct timeval start; // struct timeval stop; static char buffer[1034]; static long counter=0; struct libusb_transfer * transfer_in; cbd = (cbdata_p)transfer->user_data; // gettimeofday( &(start), NULL ); switch(transfer->status) { case LIBUSB_TRANSFER_COMPLETED: // write( 1, transfer->buffer, transfer->actual_length ); if(*cbd->bytes_per_sample==2) { c=recalc/32.0/1024.0; for( j=0; jactual_length/sizeof(short); j++ ) { rs=(short)((uint16_t *)(transfer->buffer))[j]; cbd->outbuf[j]=rs*c; } } else { c=recalc/2.0/1024.0/1024.0/1024.0; for( j=0; jactual_length/sizeof(int); j++ ) { ri=(int)((uint32_t *)(transfer->buffer))[j]; cbd->outbuf[j]=ri*c; } } // write( 1, cbd->outbuf, j*sizeof(float) ); // write msg to remote system y=j*sizeof(float); for( k=0; kfreq ); filler=(*cbd->atten) | (*cbd->filter)<<1 | (*cbd->sampling)<<4; *(short *)(buffer+8) = htons( filler ); memcpy( buffer+10, ((char *)(cbd->outbuf))+k, y-k<1024?y-k:1024 ); res = sendto( cbd->sockfd, buffer, y-k<1024?y-k+4:1034, 0, cbd->sa, cbd->salen ); if( res < 0 ) { fprintf( stderr, "CB UDP error (%d)\n", res ); } } break; case LIBUSB_TRANSFER_CANCELLED: fprintf( stderr, "CB result: Cancelled %d\n", cbd->obj ); break; case LIBUSB_TRANSFER_NO_DEVICE: fprintf( stderr, "CB result: Nodevice %d\n", cbd->obj ); break; case LIBUSB_TRANSFER_TIMED_OUT: fprintf( stderr, "CB result: Timedout %d\n", cbd->obj ); break; case LIBUSB_TRANSFER_ERROR: fprintf( stderr, "CB result: Error %d\n", cbd->obj ); break; case LIBUSB_TRANSFER_STALL: fprintf( stderr, "CB result: Stalled %d\n", cbd->obj ); break; case LIBUSB_TRANSFER_OVERFLOW: fprintf( stderr, "CB result: Overflowed %d\n", cbd->obj ); break; } fflush( stderr ); transfer_in = cbd->transfer; res = libusb_submit_transfer( transfer_in ); if( res ) { fprintf( stderr, "libusb_submit_transfer failed (%d)\n", res ); } // gettimeofday( &(stop), NULL ); // fprintf( stderr, "hf;%f;time= %f mSec\n",start.tv_sec*1000+0.001*start.tv_usec,(stop.tv_sec-start.tv_sec)*1000+0.001*(stop.tv_usec-start.tv_usec) ); } void set_FREQ( long LOfreq ) { int res; unsigned char buffer[1024]; int j; double tuningFreq; int sampleRateCorr; unsigned int tuningWordHex, twLS, twMS; // read global offset memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xA2, 0x4028, 0x0151, buffer, 4, 0 ); if( res==4 ){ memcpy( &globalOffset, buffer, 4 ); fprintf( stderr, "Global Offset: %f\n", globalOffset ); } else { sampleRateCorr = 0; fprintf( stderr, "Global Offset failed (%d)\n", res ); return; } // read lp offset memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xA2, 0x402c, 0x0151, buffer, 4, 0 ); if( res==4 ){ memcpy( &lpOffset, buffer, 4 ); fprintf( stderr, "LP Offset: %f\n", lpOffset ); } else { sampleRateCorr = 0; fprintf( stderr, "LP Offset failed (%d)\n", res ); return; } // read att offset memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xA2, 0x4030, 0x0151, buffer, 4, 0 ); if( res==4 ){ memcpy( &attOffset, buffer, 4 ); fprintf( stderr, "ATT Offset: %f\n", attOffset ); } else { sampleRateCorr = 0; fprintf( stderr, "ATT Offset failed (%d)\n", res ); return; } // read sample rate correction memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xA2, 0x4024, 0x0151, buffer, 4, 0 ); if( res==4 ){ memcpy( &sampleRateCorr, buffer, 4 ); fprintf( stderr, "Sample Rate Correction: %d\n", sampleRateCorr ); } else { sampleRateCorr = 0; fprintf( stderr, "Sample rare correction failed (%d)\n", res ); return; } if( isDuo ) { // set tuning frequency into FPGA memset( buffer, 0, sizeof( buffer ) ); tuningFreq = LOfreq - (floor(LOfreq/(S_RATE+sampleRateCorr)) * (S_RATE+sampleRateCorr)); tuningWordHex = (unsigned int)((4294967296.0*tuningFreq)/(S_RATE+sampleRateCorr)); fprintf( stderr, "Tuning TuningHEX=%08X ", tuningWordHex ); twLS = tuningWordHex&0x0000FFFF; tuningWordHex>>=16; twMS = 0xF2; twMS <<= 8; twMS |= (tuningWordHex&0x000000FF); tuningWordHex>>=8; buffer[0] = tuningWordHex&0x000000FF; buffer[1] = 0; // fprintf( stderr, "twMS=%04X twLS=%04X Buffer[0]=%02X Buffer[1]=%02X\n", twMS, twLS, buffer[0], buffer[1] ); res = libusb_control_transfer( dev_handle, 0x40, 0xE1, twLS, twMS, buffer, 2, 0 ); if( res == 2 ) { // printf( "Xilinx frequency set\n" ); } else { fprintf( stderr, "Xilinx Frequency set failed\n" ); return; } // verify that CAT buffer is free from previous commands memset( buffer, 0, sizeof( buffer ) ); for( j=0; ; j++ ) { res = libusb_control_transfer( dev_handle, 0xc0, 0xE1, 0x00, 0x0FC<<8, buffer, 3, 0 ); if( res != 3 || ((buffer[2]&0x04)!=0x04) || j==200 ) { break; } usleep( 10000 ); } if( res != 3 ) { fprintf( stderr, "CAT buffer waiting error\n" ); return; } if ((j==200)&&(buffer[2]&0x04)==0x04) { fprintf( stderr, "CAT buffer waiting timeout\n" ); return; } // fprintf( stderr, "CAT buffer waiting ended (%d)\n", j ); // set tuning frequency to ibe delivered to CAT memset( buffer, 0, sizeof( buffer ) ); sprintf( (char *)buffer, "CF%11ld;", LOfreq ); res = libusb_control_transfer( dev_handle, 0x40, 0xE1, 16, 0xF1<<8, buffer, 16, 0 ); // printf( "End setting cat frequency\n" ); printf( "Duo set freq %ld\n", LOfreq ); } else { // set tuning frequency into FPGA memset( buffer, 0, sizeof( buffer ) ); tuningFreq = LOfreq - (floor(LOfreq/((isS1?S_RATE_S1:S_RATE)+sampleRateCorr)) * ((isS1?S_RATE_S1:S_RATE)+sampleRateCorr)); tuningWordHex = (unsigned int)((4294967296.0*tuningFreq)/((isS1?S_RATE_S1:S_RATE)+sampleRateCorr)); // fprintf( stderr, "Tuning TuningHEX=%08X ", tuningWordHex ); twLS = tuningWordHex&0x0000FFFF; tuningWordHex>>=16; twMS = tuningWordHex&0x0000FFFF; buffer[0] = tuningWordHex&0x000000FF; buffer[1] = 0; res = libusb_control_transfer( dev_handle, 0x40, 0xF2, twLS, twMS, buffer, 2, 0 ); if( res == 2 ) { // printf( "Xilinx frequency set\n" ); } else { fprintf( stderr, "Xilinx Frequency set failed\n" ); } printf( "S1/S2 set freq %ld\n", LOfreq ); } } void set_filter( long freq, int filter, int atten ) { int j; int res; unsigned char buffer[1024]; unsigned int fl; if( isS1 ) { res = libusb_control_transfer( dev_handle, 0xc0, 0xF7, (unsigned int)filter, 0x0002, buffer, 1, 0 ); if( res != 1 || buffer[0] != 0xF7 ) { fprintf( stderr, "Set filters failed (%d %02X)\n", res, buffer[0] ); } fprintf( stderr, "S1 Filters set (%d)\n", filter ); res = libusb_control_transfer( dev_handle, 0xc0, 0xF7, (unsigned int)atten, 0x0003, buffer, 1, 0 ); if( res != 1 || buffer[0] != 0xF7 ) { fprintf( stderr, "Set attenuator failed (%d %02X)\n", res, buffer[0] ); } fprintf( stderr, "S1 Attenuation set (%d)\n", atten ); } if( isS2 ) { if( freq < 61440000 ) { fl=0x03; } else if( freq < 122880000 ) { fl=0x02; } else { fl=0x04; } if( !filter ) { fl = 0x01; } if( atten ) { fl |=0x08; } res = libusb_control_transfer( dev_handle, 0xc0, 0xF7, fl, 0x0002, buffer, 1, 0 ); if( res != 1 || buffer[0] != 0xF7 ) { fprintf( stderr, "Set filters failed (%d %02X)\n", res, buffer[0] ); } fprintf( stderr, "S2 Filters set (%d)\n", filter ); } if( isDuo ) { // verify that CAT buffer is free from previous commands memset( buffer, 0, sizeof( buffer ) ); for( j=0; ; j++ ) { res = libusb_control_transfer( dev_handle, 0xc0, 0xE1, 0x00, 0x0FC<<8, buffer, 3, 0 ); if( res != 3 || ((buffer[2]&0x04)!=0x04) || j==200 ) { break; } usleep( 10000 ); } if( res != 3 ) { fprintf( stderr, "CAT buffer waiting error\n" ); return; } if ((j==200)&&(buffer[2]&0x04)==0x04) { fprintf( stderr, "CAT buffer waiting timeout\n" ); return; } // fprintf( stderr, "CAT buffer waiting ended (%d)\n", j ); // set filter to be delivered to CAT memset( buffer, 0, sizeof( buffer ) ); sprintf( (char *)buffer, "LP%1d;", filter ); res = libusb_control_transfer( dev_handle, 0x40, 0xE1, 16, 0xF1<<8, buffer, 16, 0 ); fprintf( stderr, "DUO LPF set (%d - %s -> %d)\n", filter, buffer, res ); // set atten to be delivered to CAT memset( buffer, 0, sizeof( buffer ) ); sprintf( (char *)buffer, "AT%1d;", atten ); res = libusb_control_transfer( dev_handle, 0x40, 0xE1, 16, 0xF1<<8, buffer, 16, 0 ); fprintf( stderr, "DUO Attenuation set (%d - %s -> %d)\n", atten, buffer, res ); } recalc = pow( 10.0,((isDuo?21.4:0)+rescale+globalOffset+(filter?lpOffset:0)+(atten?attOffset:0))/20.0); } char *manageMessage( char * message, int len, threaddata_p payload ) { static char retbuf[1024]; fprintf( stderr, "message %s (%d)\n", message, len ); if( len>=3 && !strncmp( message, "AT", 2 ) ) { if( message[2] != '0' ) { *payload->atten = 1; } else { *payload->atten = 0; } set_filter( *payload->freq, *payload->filter, *payload->atten ); sprintf( retbuf, "AT%1d;", *payload->atten ); } else if( len>=3 && !strncmp( message, "LP", 2 ) ) { if( message[2] != '0' ) { *payload->filter = 1; } else { *payload->filter = 0; } set_filter( *payload->freq, *payload->filter, *payload->atten ); sprintf( retbuf, "LP%1d;", *payload->filter ); } else if( len>=4 && !strncmp( message, "FC", 2 ) ) { *payload->freq=atol( message+2 ); fprintf( stderr, "request %ld Hz frequency set\n", *payload->freq ); set_FREQ( *payload->freq ); sprintf( retbuf, "CF%011ld;", *payload->freq ); } else if( message[0]=='F' ) { *payload->freq=atol( message+1 ); fprintf( stderr, "request %ld Hz frequency set\n", *payload->freq ); set_FREQ( *payload->freq ); sprintf( retbuf, "CF%011ld;", *payload->freq ); } else if( message[0]=='A' ) { *payload->atten=*payload->filter=0; if( message[1] != '0' ) { *payload->atten = 1; } else { *payload->atten = 0; } if( message[2] != '0' ) { *payload->filter = 1; } else { *payload->filter = 0; } set_filter( *payload->freq, *payload->filter, *payload->atten ); sprintf( retbuf, "AT%1d;LP%1d;", *payload->atten, *payload->filter ); } return( retbuf ); } void *tcpManage( void *payload ) { int pfd; struct sockaddr_in saddr; int chfd; struct hostent *host; struct sockaddr_in cliaddr; unsigned int clilun; char buf[1024]; char *hp; int j, n; threaddata_p payl =(threaddata_p)payload; int port = payl->port; int loop; char *retbuf; // socket: create the socket pfd = socket( AF_INET, SOCK_STREAM, 0 ); if( pfd == -1 ) { fprintf( stderr, "Socket open error\n" ); exit( 1 ); } int opt = 1; setsockopt( pfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt , sizeof(int) ); memset( &saddr, 0, sizeof(saddr) ); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl( INADDR_ANY ); saddr.sin_port = htons( (unsigned short)port ); if( bind( pfd, (struct sockaddr *) &saddr, sizeof( saddr ) ) == -1 ) { fprintf( stderr, "Binding Error\n" ); exit( 2 ); } if( listen( pfd, 1 ) == -1 ) { fprintf( stderr, "Listening Error\n" ); exit( 3 ); } fprintf( stderr, "Listening on port %d\n", port ); clilun = sizeof( cliaddr ); for( ;; ) { // wait for a connection request chfd = accept( pfd, (struct sockaddr *) &cliaddr, &clilun ); if( chfd == -1 ) { fprintf( stderr, "Accept-ing Error\n" ); exit( 4 ); } // determine the message sender host = gethostbyaddr( (const char *)&cliaddr.sin_addr.s_addr, sizeof(cliaddr.sin_addr.s_addr), AF_INET ); if( !host ) { fprintf( stderr, "GetHostByName Error\n" ); exit( 5 ); } hp = inet_ntoa(cliaddr.sin_addr); if( !hp ) { fprintf( stderr, "inet_ntoa Error\n" ); exit( 6 ); } else { fprintf( stderr, "Connected by %s\n", hp ); } for( loop=0;; ) { fprintf( stderr, "TCP loop\n" ); memset( buf, 0, sizeof( buf ) ); for( j=0, n=0; j 0 ) { break; } if( n == -1 ) { break; } } n = close( chfd ); if( n == -1 ) { fprintf( stderr, "TCP close Error\n" ); exit( 9 ); } fprintf( stderr, "TCP closed\n" ); } } int main( int ac, char *av[], char **ev ) { libusb_context *ctx; libusb_device **devs; struct libusb_device_descriptor desc; int cnt, vid, pid; int j,k; int res; unsigned char buffer[1024]; unsigned char pBuffer1[512*24]; unsigned char pBuffer2[512*24]; unsigned char pBuffer3[512*24]; unsigned char pBuffer4[512*24]; struct libusb_transfer *transfer_in1; struct libusb_transfer *transfer_in2; struct libusb_transfer *transfer_in3; struct libusb_transfer *transfer_in4; float pBuffer1a[512*12]; float pBuffer2a[512*12]; float pBuffer3a[512*12]; float pBuffer4a[512*12]; cbdata_t cbdata1; cbdata_t cbdata2; cbdata_t cbdata3; cbdata_t cbdata4; threaddata_t threaddata0; pthread_t pthread0; pthread_attr_t attr0; long LOfreq; static int atten; static int filter; static char sampling; long resampling; static int bytes_per_sample=4; static int sockfd; static socklen_t salen; static struct sockaddr *sa; struct addrinfo hints, *rlist, *rlistsave; char *host; int port; char *ports; fprintf( stderr, "Operations init elad-comms version 1.0\n" ); // Read Central Frequency From Argument, if not 14200000 if( ac<3 ) { LOfreq = 14200000; } else { sscanf( av[2], "%ld", &LOfreq ); } fprintf( stderr, "Central Frequency: %10ld\n", LOfreq ); // Read Filter + atten From Argument, if not 1/0 if( ac<4 ) { filter = 1; atten = 0; } else { filter=av[3][0]-'0'; atten=av[3][1]-'0'; } fprintf( stderr, "filter: %d atten: %d\n", filter, atten ); // Read samplerate From Argument, if not 192000 if( ac<5 ) { resampling = 192000; } else { sscanf( av[4], "%ld", &resampling ); } fprintf( stderr, "resampling: %ld\n", resampling ); // Read host from Argument, if not localhost if( ac<6 ) { host = "localhost"; } else { host = av[5]; } fprintf( stderr, "host: %s\n", host ); // Read portnumber from Argument, if not 6666 if( ac<7 ) { port = 6666; ports = "6666"; } else { port = atoi(av[6]); ports = av[6]; } fprintf( stderr, "portnumber: %d\n", port ); switch(resampling) { case 6144000: bytes_per_sample=2; rescale=-0.7; sampling=6; break; case 3072000: bytes_per_sample=4; rescale=5.4; sampling=5; break; case 1536000: bytes_per_sample=4; rescale=5.4; sampling=4; break; case 768000: bytes_per_sample=4; rescale=6; sampling=3; break; case 384000: bytes_per_sample=4; rescale=6; sampling=2; break; case 192000: bytes_per_sample=4; rescale=0; sampling=1; break; default: bytes_per_sample=4; rescale=0; sampling=1; break; } threaddata0.port = port; threaddata0.freq = &LOfreq; threaddata0.sampling = &sampling; threaddata0.atten = &atten; threaddata0.filter = &filter; threaddata0.bytes_per_sample = &bytes_per_sample; threaddata0.rescale = rescale; // Initialize libusb-1.0 res = libusb_init(&ctx); if( res < 0 ){ fprintf( stderr, "Init Error %d\n", res ); return 1; } // set verbosity level to 3, as suggested in the documentation libusb_set_debug( ctx, 3 ); cnt = libusb_get_device_list(ctx, &devs); if(cnt < 0) { fprintf( stderr, "Get Device Error\n" ); return 3; } for( j=0,k=0; j%s< Need >%s<\n", buffer, av[1] ); libusb_close( dev_handle ); dev_handle = NULL; } } k++; } if( j==cnt ) { fprintf( stderr, "Cannot find FDM Device\n" ); return 5; } if( !dev_handle ) { res = libusb_open( devs[j], &dev_handle ); if( res ) { fprintf( stderr, "Cannot open FDM Device\n" ); return 6; } else { fprintf( stderr, "FDM Device Opened\n" ); } libusb_free_device_list( devs, 1 ); fprintf( stderr, "libusb devices list freed\n" ); // detach kernel drivers if( libusb_kernel_driver_active( dev_handle, 0 ) == 1 ) { fprintf( stderr, "Kernel Driver Active\n" ); if( libusb_detach_kernel_driver( dev_handle, 0 ) == 0 ) { fprintf( stderr, "Kernel Driver Detached\n" ); } } // claim interface if( libusb_claim_interface( dev_handle, 0 ) < 0 ) { fprintf( stderr, "Cannot claim Interface\n" ); return 7; } fprintf( stderr, "Interface claimed\n" ); } if( isDuo ) { // stop FIFO memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xE1, 0x0000, 0xE9<<8, buffer, 1, 0 ); // res = control_transfer( localDeviceInfo.winUsbHandle, 0xc0, 0xE1, 0x0000, 0x00E9<<8, buffer, 1, 0 ); if( res==1 ){ fprintf( stderr, "Stop FIFO\n" ); } else { fprintf( stderr, "Stop FIFO failed (%d)\n", res ); } // imposta la FIFO di EP6 del CY-USB in modalità slave... memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xE1, 0x0000, 0xE8<<8, buffer, 1, 0 ); if( res==1 ){ fprintf( stderr, "Init FIFO\n" ); } else { fprintf( stderr, "Init FIFO failed (%d)\n", res ); } // set tuning frequency sprintf( (char *)buffer, ";F%ld", LOfreq ); manageMessage( (char *)buffer, strlen( (char *)buffer ), &threaddata0 ); sprintf( (char *)buffer, ";A%1d%1d", filter, atten ); manageMessage( (char *)buffer, strlen( (char *)buffer ), &threaddata0 ); // start FIFO memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xE1, 0x0001, 0x0E9<<8, buffer, 1, 0 ); if( res != 1 || buffer[0] != 0xE9 ) { fprintf( stderr, "Enable SYN failed (%d %02X)\n", res, buffer[0] ); } fprintf( stderr, "SYN Enabled\n" ); } else { // set tuning frequency sprintf( (char *)buffer, "F%ld\n", LOfreq ); manageMessage( (char *)buffer, strlen( (char *)buffer ), &threaddata0 ); sprintf( (char *)buffer, "A%1d%1d\n", filter, atten ); manageMessage( (char *)buffer, strlen( (char *)buffer ), &threaddata0 ); // start FIFO memset( buffer, 0, sizeof( buffer ) ); res = libusb_control_transfer( dev_handle, 0xc0, 0xE9, 0x0001, 0x0000, buffer, 1, 0 ); if( res != 1 || buffer[0] != 0xE9 ) { fprintf( stderr, "Enable SYN failed (%d %02X)\n", res, buffer[0] ); return 13; } fprintf( stderr, "SYN Enabled\n" ); } // initilize addrinfo structure memset( &hints, 0, sizeof(struct addrinfo) ); hints.ai_family=AF_UNSPEC; hints.ai_socktype=SOCK_DGRAM; hints.ai_protocol=IPPROTO_UDP; res = getaddrinfo( host, ports, &hints, &rlist ); if( res == -1 ){ fprintf( stderr, "udp error for %s, %s: %s", host, ports, gai_strerror( res ) ); return 19; } rlistsave = rlist; for( j=0; ; rlist=rlist->ai_next ) { sockfd=socket( rlist->ai_family, rlist->ai_socktype, rlist->ai_protocol ); if( sockfd>= 0 ){ break; } } sa=malloc( rlist->ai_addrlen ); memcpy(sa, rlist->ai_addr, rlist->ai_addrlen ); salen=rlist->ai_addrlen; freeaddrinfo( rlistsave ); fprintf( stderr, "UDP out prepared\n" ); // prepare async transfer transfer_in1 = libusb_alloc_transfer(0); if( !transfer_in1 ) { fprintf( stderr, "libusb_alloc_transfer failed\n" ); return 14; } transfer_in2 = libusb_alloc_transfer(0); if( !transfer_in2 ) { fprintf( stderr, "libusb_alloc_transfer failed\n" ); return 15; } transfer_in3 = libusb_alloc_transfer(0); if( !transfer_in3 ) { fprintf( stderr, "libusb_alloc_transfer failed\n" ); return 16; } transfer_in4 = libusb_alloc_transfer(0); if( !transfer_in4 ) { fprintf( stderr, "libusb_alloc_transfer failed\n" ); return 17; } fprintf( stderr, "libusb_alloc_transfer succedeed\n" ); // create thread that reads commands from tcp pthread_attr_init( &attr0 ); pthread_create( &pthread0, &attr0, tcpManage, (void *)&threaddata0 ); fprintf( stderr, "Tcp manage thread created\n" ); cbdata1.obj=0; cbdata1.transfer=transfer_in1; cbdata1.outbuf=pBuffer1a; cbdata1.freq = &LOfreq; cbdata1.sampling = &sampling; cbdata1.atten = &atten; cbdata1.filter = &filter; cbdata1.sockfd=sockfd; cbdata1.salen=salen; cbdata1.sa=sa; cbdata1.bytes_per_sample = &bytes_per_sample; cbdata1.rescale = rescale; cbdata2.obj=1; cbdata2.transfer=transfer_in2; cbdata2.outbuf=pBuffer2a; cbdata2.freq = &LOfreq; cbdata2.sampling = &sampling; cbdata2.atten = &atten; cbdata2.filter = &filter; cbdata2.sockfd=sockfd; cbdata2.salen=salen; cbdata2.sa=sa; cbdata2.bytes_per_sample = &bytes_per_sample; cbdata2.rescale = rescale; cbdata3.obj=2; cbdata3.transfer=transfer_in3; cbdata3.outbuf=pBuffer3a; cbdata3.freq = &LOfreq; cbdata3.sampling = &sampling; cbdata3.atten = &atten; cbdata3.filter = &filter; cbdata3.sockfd=sockfd; cbdata3.salen=salen; cbdata3.sa=sa; cbdata3.bytes_per_sample = &bytes_per_sample; cbdata3.rescale = rescale; cbdata4.obj=3; cbdata4.transfer=transfer_in4; cbdata4.outbuf=pBuffer4a; cbdata4.freq = &LOfreq; cbdata4.sampling = &sampling; cbdata4.atten = &atten; cbdata4.filter = &filter; cbdata4.sockfd=sockfd; cbdata4.salen=salen; cbdata4.sa=sa; cbdata4.bytes_per_sample = &bytes_per_sample; cbdata4.rescale = rescale; libusb_fill_bulk_transfer( transfer_in1, dev_handle, 0x86, pBuffer1, 512*24, cb_in, &cbdata1, 2000); libusb_fill_bulk_transfer( transfer_in2, dev_handle, 0x86, pBuffer2, 512*24, cb_in, &cbdata2, 2000); libusb_fill_bulk_transfer( transfer_in3, dev_handle, 0x86, pBuffer3, 512*24, cb_in, &cbdata3, 2000); libusb_fill_bulk_transfer( transfer_in4, dev_handle, 0x86, pBuffer4, 512*24, cb_in, &cbdata4, 2000); res = libusb_submit_transfer( transfer_in1 ); if( res ) { fprintf( stderr, "libusb_submit_transfer failed (%d)\n", res ); return 18; } res = libusb_submit_transfer( transfer_in2 ); if( res ) { fprintf( stderr, "libusb_submit_transfer failed (%d)\n", res ); return 19; } res = libusb_submit_transfer( transfer_in3 ); if( res ) { fprintf( stderr, "libusb_submit_transfer failed (%d)\n", res ); return 20; } res = libusb_submit_transfer( transfer_in4 ); if( res ) { fprintf( stderr, "libusb_submit_transfer failed (%d)\n", res ); return 21; } fprintf( stderr, "libusb_submit_transfer succedeed\n" ); fprintf( stderr, "SYN transfer starting\n" ); // main loop for( j=0, res=0; res==0 ; j++) { res = libusb_handle_events_completed( ctx, NULL ); } fprintf( stderr, "libusb_handle events completed (%d)\n", res ); // dirty exit fprintf( stderr, "Operations end\n" ); return 0; }