ciusss89

main.c

Sep 27th, 2012
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.40 KB | None | 0 0
  1. /*
  2.  VERSIONE PULITA E COSTRUITA PER LA SOLA 0xb39 - 0xb38
  3. */
  4.  
  5. #include "main.h"
  6.  
  7.  using namespace std;
  8.  
  9.  // Entry of main function
  10.  int main(int argc, char *argv[]){
  11.     bool b_overrun = false;         //  buffer overrun flag
  12.     bool b_RFI = false;
  13.     char cp_filename[64];           //  data file name
  14.     char cp_agc_filename[64];       //  agc data file name (when agc_on = 1)
  15.     char version;               //  version of modules
  16.     unsigned char uc_flags[5];
  17.  
  18.     /*  Control Variable */
  19.     int i_col_mode = 32;            //  Data collection mode, default value is 32
  20.     int i_AGC = 1;              //
  21.     int i_col_time = 0;
  22.     int i_tmp = 0;
  23.     int i_ch = -1;              //  Command parameter buffer;
  24.     int i_decimate = 1;
  25.     int i_RFI_det = 0;
  26.    
  27.     /*  State variable */
  28.     unsigned int ui_agc_count = 0;      //  AGC data collected size
  29.     unsigned int ui_pack = 1;       //  Pack mode
  30.     unsigned int ui_time_to_collect = 2;    //  Data collection time
  31.     unsigned int agc_on = 0;        //  AGC logging on/off flag
  32.  
  33.     unsigned int ul_buf_size = 1048576*32;
  34.     unsigned int ul_agc_buf_size = 320;
  35.     unsigned int ul_num_bytes_written = 0;
  36.  
  37.     bool b_run = true;          //  Main loop control variable
  38.     unsigned int k = 0;         //  Main loop numbers
  39.     unsigned int ui_agc_tot = 0;        //
  40.     unsigned int ui_agc_buf_pos = 0;    //
  41.  
  42.     float ul_kmax;              //  Size of data buffered
  43.     timeval tv_max, tv_now, tv_start;
  44.  
  45.  
  46.     /*  Clear date file name */
  47.     strcpy(cp_agc_filename," ");
  48.     strcpy(cp_filename," ");
  49.  
  50.     /*  Timer   */
  51.     timeval st_cpu_time;
  52.     string  str;
  53.     /*  Device */
  54.     Fx2_dev fx2_d = Fx2_dev(0);
  55.  
  56.     /************************* Look for a device*****************************/
  57.     fx2_d = Fx2_dev(0);     //  Looking for device with PID 0x0b38   -> CORREGERE Fx2_dev(0).
  58.     if (fx2_d.usb_fx2_find() != 0)
  59.         version = 0;
  60.     else{
  61.         printf("\t no GNSS frontend found\n");
  62.         fx2_d.close();
  63.         return(0);
  64.     }
  65.  
  66.     /************************ Display the help information according to module 0x0b39 **************/
  67.     while ( (i_ch = getopt (argc,argv,"ho:s:")) != EOF ){
  68.         switch(i_ch){
  69.             case 'h':   // help
  70.                 help_lv();
  71.                 return 0;
  72.             case 's':   // size(sec)
  73.                 sscanf(optarg, "%u", &ui_time_to_collect);
  74.                 break;
  75.             case 'o':   // filename
  76.                 strcpy(cp_filename, optarg);
  77.                 i_tmp = strlen(optarg);
  78.                 if (i_tmp>4){
  79.                             memcpy(cp_agc_filename,(const char*)optarg,(i_tmp-2));
  80.                             memcpy((cp_agc_filename+i_tmp-4),"_agc.bin\0",sizeof("_agc.bin\0"));
  81.                         }else{
  82.                             strcpy(cp_agc_filename,"test_agc.bin");
  83.                         }
  84.                         break;
  85.             default:
  86.                         break;
  87.             }
  88.     }
  89.  
  90.  
  91.  
  92.     /***********************  Create init file *******************************************/
  93.     if (strlen(cp_filename)<2){
  94.             strcpy(cp_filename, "test.bin");
  95.             strcpy(cp_agc_filename,"test_agc.bin");
  96.     }
  97.     FileSaver fs = FileSaver(cp_filename);
  98.     fs.open_file(cp_filename);
  99.     fs.set_fid(1);
  100.     fs.set_decimate(i_decimate);
  101.     fs.set_pack(ui_pack);
  102.  
  103.     FileSaver fs_agc =FileSaver(cp_agc_filename);
  104.     fs_agc.open_file(cp_agc_filename);
  105.     fs_agc.set_fid(100);
  106.     fs_agc.set_pack(1);
  107.     fs_agc.set_decimate(1);
  108.  
  109.     if(agc_on == 0){
  110.         fs_agc.close_file();
  111.         remove(cp_agc_filename);
  112.     }
  113.  
  114.     /*****************************INIT USB **********************************/
  115.         fx2_d.usb_fx2_init();
  116.         fx2_d.usrp_xfer (VRQ_AGC,0);
  117.  
  118.     fx2_d.usrp_xfer (VRQ_CMODE,132 );
  119.     fx2_d.usrp_xfer (VRQ_XFER, 0 );
  120.  
  121.     fx2_d.usrp_xfer (VRQ_XFER, 1);
  122.     fx2_d.usrp_xfer2(VRQ_FLAGS, 0, uc_flags, 5);
  123.     fx2_d.usrp_xfer (VRQ_XFER, 0 );
  124.  
  125.     /******************************INIT Buffers ************************/
  126.     short *shp_agc_data;
  127.     short *shp_agc_data_store;
  128.     char  *ch_if_data;
  129.     timeval tv;
  130.  
  131.     fs.set_decimate(i_decimate);
  132.  
  133.     // Allocate buffer
  134.     ch_if_data = new char[BUFSIZE];
  135.     shp_agc_data = new short[100];
  136.  
  137.     // Initiate buffer
  138.     for(int t = 0; t< 100; t++)
  139.             shp_agc_data[t] = 0;
  140.     for(int t = 0; t<BUFSIZE; t++)
  141.             ch_if_data[t] = 0;
  142.  
  143.         // Set up the Timer
  144.     tv_max.tv_sec = i_col_time;
  145.     gettimeofday(&tv_start,NULL);
  146.  
  147.     fx2_d.usrp_xfer(VRQ_CMODE, i_col_mode);
  148.     fx2_d.usrp_xfer(VRQ_XFER, 1);
  149.     gettimeofday(&tv_max,NULL);
  150.  
  151.     gettimeofday(&tv_now,NULL);
  152.  
  153.     int j = 0;      // Buffer data collected in each loop
  154.     int currK = 0;
  155.     float percentage = 0.0;
  156.    
  157.     while(b_run){
  158.             // Time control
  159.             if ((tv_now.tv_sec+tv_now.tv_usec/1e6) - (tv_start.tv_sec+tv_start.tv_usec/1e6) >= ui_time_to_collect){
  160.                 // Set the current cursor to the right position
  161.                 printf("%3.0f%% data collected",100.0);
  162.                 b_run = false;
  163.             }
  164.  
  165.             // Print capture information at the start
  166.             if(k==0){
  167.                 printf("\n");
  168.                 switch(i_col_mode){
  169.                     case 32:
  170.                         ul_kmax = 16.368 * ui_time_to_collect/i_decimate;
  171.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  172.                         break;
  173.                     case 36:
  174.                         ul_kmax = 8.184 * ui_time_to_collect/i_decimate;
  175.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  176.                         break;
  177.                     case 38:
  178.                         ul_kmax = 5.456 * ui_time_to_collect/i_decimate;
  179.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  180.                         break;
  181.                     case 42:
  182.                         ul_kmax = 4.092 * ui_time_to_collect/i_decimate;
  183.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  184.                         break;
  185.                     case 132:
  186.                         ul_kmax = 16.368 * ui_time_to_collect/i_decimate;
  187.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  188.                         break;
  189.                     case 136:
  190.                         ul_kmax = 8.184 * ui_time_to_collect/i_decimate;
  191.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  192.                         break;
  193.                     case 138:
  194.                         ul_kmax = 5.456 * ui_time_to_collect/i_decimate;
  195.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  196.                         break;
  197.                     case 142:
  198.                         ul_kmax = 4.092 * ui_time_to_collect/i_decimate;
  199.                         printf("Attemping to collect %dsecs/%.1fMB of data\n",ui_time_to_collect,ul_kmax);
  200.                         break;
  201.                     default:
  202.                         break;
  203.                 }
  204.                 printf("%3.0f%% date collected\n",1.0);
  205.             }
  206.  
  207.             k++;
  208.             //  Print progress information
  209.             if ((k%250)==0){
  210.             switch(i_col_mode){
  211.                     case 32:
  212.                         if ((k%1000) == 0){
  213.                             percentage = k/10/ui_time_to_collect;
  214.                             (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  215.                         }
  216.                         break;
  217.                     case 36:
  218.                         if ((k%500) == 0){
  219.                             percentage = k/10*2/ui_time_to_collect;
  220.                             (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  221.                         }
  222.                         break;
  223.                     case 38:
  224.                         percentage = k/10*3/ui_time_to_collect;
  225.                         (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  226.                         break;
  227.                     case 42:
  228.                         percentage = k/10*4/ui_time_to_collect;
  229.                         (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  230.                         break;
  231.                     case 132:
  232.                         if ((k%1000) == 0){
  233.                             percentage = k/10/ui_time_to_collect;
  234.                             (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  235.                         }
  236.                         break;
  237.                     case 136:
  238.                         if ((k%500) == 0){
  239.                             percentage = k/10*2/ui_time_to_collect;
  240.                             (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  241.                         }
  242.                         break;
  243.                     case 138:
  244.                         percentage = k/10*3/ui_time_to_collect;
  245.                         (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  246.                         break;
  247.                     case 142:
  248.                         percentage = k/10*4/ui_time_to_collect;
  249.                         (percentage>1)?printf("%3.0f%% date collected\n",percentage):printf("%3.0f%% date collected\n",1.0);
  250.                         break;
  251.                     default:
  252.                         break;
  253.             }
  254.         }
  255.  
  256.         //  Check buffer overrun
  257.         fx2_d.check_rx_overrun (&b_overrun );
  258.         if ( b_overrun==true ){
  259.             gettimeofday(&tv_now,NULL);
  260.             printf("Buffer Overrun!\n");
  261.             delete []ch_if_data;
  262.             delete []shp_agc_data;
  263.             if(agc_on == 1)
  264.                 fs_agc.close_file();
  265.             fs.close_file();
  266.             switch(i_col_mode){
  267.                 case 32: currK = int(k/1000);break;
  268.                 case 36: currK = int(k/1000*2);break;
  269.                 case 38: currK = int(k/1000*3);break;
  270.                 case 42: currK = int(k/1000*4);break;
  271.                 case 132: currK = int(k/1000); break;
  272.                 case 136: currK = int(k/1000*2);break;
  273.                 case 138: currK = int(k/1000*3);break;
  274.                 case 142: currK = int(k/1000*4);break;
  275.                 default: break;
  276.             }
  277.             printf("%dsec/%dMB data collected\n",currK,(int)(ul_num_bytes_written/1e6));
  278.             fs_agc.close_file();
  279.             remove(cp_agc_filename);
  280.             fx2_d.close();
  281.             fx2_d.~Fx2_dev();
  282.             return(EXIT_FAILURE);
  283.         }
  284.  
  285.         //  Read data
  286.         j = fx2_d.read_IF(ch_if_data);
  287.         if ((j>0)){
  288.             ul_num_bytes_written +=j;           //  Number of data collection update
  289.             fs.save_data(ch_if_data,j,i_col_mode);  //  Write data buffered to disc
  290.         }
  291.  
  292.         //  Get current time
  293.         gettimeofday(&tv_now,NULL);
  294.  
  295.     }
  296.  
  297.     gettimeofday(&tv_now,NULL);
  298.     printf("\n");
  299.     // To modify
  300.     std::cout<<"Total time = "<< (float)((tv_now.tv_sec+tv_now.tv_usec/1e6) - (tv_start.tv_sec+tv_start.tv_usec/1e6))+(tv_now.tv_usec-tv_start.tv_usec)/1e6<<"s"<<endl;
  301.     std::cout<<"Data size = "<<ul_num_bytes_written/1e6<<"MB"<<std::endl;
  302.     std::cout<<"Average speed = "<< (ul_num_bytes_written/((float)(tv_now.tv_sec - tv_start.tv_sec+(tv_now.tv_usec-tv_start.tv_usec)/1e6)))/1e6<<"MB/s"<<endl;
  303.     gettimeofday(&tv_max,NULL);
  304.  
  305.     delete []shp_agc_data;
  306.     delete []ch_if_data;
  307.  
  308.     if(agc_on == 1){
  309.         printf("%d bytes of AGC data stored in ",ui_agc_buf_pos);
  310.         printf(cp_agc_filename);
  311.         printf("\n");
  312.         fs_agc.close_file();
  313.     }
  314.     fs.close_file();
  315.     if (agc_on == 0)
  316.         remove(cp_agc_filename);
  317.  
  318.     fx2_d.~Fx2_dev();
  319.     fx2_d.close();
  320.     fx2_d.~Fx2_dev();
  321.     printf("success!\n");
  322.     return 0;
  323.  }
  324.  
  325.  /* Help screen for PID 0X0B39 */
  326.  void help_lv(void)
  327. {
  328.     printf ( "\n");
  329.     printf ( "**************************************************************************\n" );
  330.     printf ( "* -o filename  : output file name                                        *\n" );
  331.     printf ( "* -s filesize  : Number of sec to collect                                *\n" );
  332.     printf ( "* -h           : help screen                                             *\n" );
  333.     printf ( "**************************************************************************\n" );
  334.     printf ( "\n" );
  335. }
Advertisement
Add Comment
Please, Sign In to add comment