Changeset 9121

Show
Ignore:
Timestamp:
08/01/08 02:49:23
Author:
eb
Message:

tx work-in-progress

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • usrp2/branches/developers/eb/merge-wip/host-ng/apps

    • Property svn:ignore changed from Makefile Makefile.in .libs .deps test_eth test_usrp2 test2_usrp2 gen_const find_usrps cerr *.sh to Makefile Makefile.in .libs .deps test_eth test_usrp2 test2_usrp2 gen_const find_usrps cerr *.sh tx_samples
  • usrp2/branches/developers/eb/merge-wip/host-ng/apps/Makefile.am

    r9118 r9121  
    2929noinst_PROGRAMS = \ 
    3030        gen_const \ 
    31         test2_usrp2 
     31        test2_usrp2 \ 
     32        tx_samples 
    3233 
    3334find_usrps = find_usrps.cc 
    3435test2_usrp2_SOURCES = test2_usrp2.cc 
    3536gen_const_SOURCES = gen_const.cc 
     37tx_samples_SOURCES = tx_samples.cc 
  • usrp2/branches/developers/eb/merge-wip/host-ng/apps/tx_samples.cc

    r9118 r9121  
    11/* -*- c++ -*- */ 
    22/* 
    3  * Copyright 2007 Free Software Foundation, Inc. 
     3 * Copyright 2007,2008 Free Software Foundation, Inc. 
    44 * 
    55 * This program is free software: you can redistribute it and/or modify 
     
    2020#include "config.h" 
    2121#endif 
    22 #include "usrp2_basic.h" 
     22#include <usrp2/usrp2.h> 
     23#include <usrp2/strtod_si.h> 
    2324#include <iostream> 
    2425#include <complex> 
    2526#include <getopt.h> 
    26 #include <gr_realtime.h> 
    27 #include "strtod_si.h" 
    28  
    29 #define T_NOW (-1) 
     27#include <gruel/realtime.h> 
    3028 
    3129typedef std::complex<float> fcomplex; 
    32  
    3330 
    3431static const char * 
     
    5855  fprintf(stderr, "  -i INTERP            set interpolation rate to INTERP [default=32]\n"); 
    5956  fprintf(stderr, "  -g gain              set tx gain\n"); 
    60   fprintf(stderr, "  -F SAMPLES_PER_FRAME number of samples in each frame [default=371]\n"); 
    6157  fprintf(stderr, "  -S SCALE             fpga scaling factor for I & Q [default=256]\n"); 
    6258} 
    6359 
    6460#define GAIN_NOT_SET (-1000) 
     61#define MAX_SAMPLES (371) 
    6562 
    6663int 
     
    7067  const char *input_filename = 0; 
    7168  bool repeat = false; 
    72   const char *mac_addr_str = 0
     69  const char *mac_addr_str = ""
    7370  double freq = 0; 
    7471  int32_t interp = 32; 
    75   int32_t samples_per_frame = U2_MAX_SAMPLES; 
    76   int32_t scale = 256
     72  int32_t samples_per_frame = MAX_SAMPLES; 
     73  int32_t scale = 3000
    7774  double gain = GAIN_NOT_SET; 
    7875   
    7976  int    ch; 
    8077  double tmp; 
    81   u2_mac_addr_t mac_addr; 
    82  
    83   while ((ch = getopt(argc, argv, "he:m:I:rf:i:F:S:g:")) != EOF){ 
     78 
     79 
     80  while ((ch = getopt(argc, argv, "he:m:I:rf:i:S:F:g:")) != EOF){ 
    8481    switch (ch){ 
    8582 
     
    9087    case 'm': 
    9188      mac_addr_str = optarg; 
     89#if 0 
    9290      if (!usrp2_basic::parse_mac_addr(optarg, &mac_addr)){ 
    9391        std::cerr << "invalid mac addr: " << optarg << std::endl; 
     
    9593        return 1; 
    9694      } 
     95#endif 
    9796      break; 
    9897 
     
    143142  } 
    144143   
     144  if (samples_per_frame < 9 || samples_per_frame > MAX_SAMPLES){ 
     145    std::cerr << prettify_progname(argv[0]) 
     146              << ": samples_per_frame is out of range.  " 
     147              << "Must be in [9, " << MAX_SAMPLES << "].\n"; 
     148    usage(argv[0]); 
     149    return 1; 
     150  } 
     151 
     152 
    145153  FILE *fp = 0; 
    146154  if (input_filename == 0) 
     
    154162  } 
    155163 
    156   if (samples_per_frame < 9 || samples_per_frame > U2_MAX_SAMPLES){ 
    157     std::cerr << prettify_progname(argv[0]) 
    158               << ": samples_per_frame is out of range.  " 
    159               << "Must be in [9, " << U2_MAX_SAMPLES << "].\n"; 
    160     usage(argv[0]); 
    161     return 1; 
    162   } 
    163  
    164   gr_rt_status_t rt = gr_enable_realtime_scheduling(); 
    165   if (rt != RT_OK) 
    166     std::cerr << "failed to enable realtime scheduling\n"; 
    167  
    168   usrp2_basic *u2 = new usrp2_basic(); 
    169  
    170   if (!u2->open(interface)){ 
    171     std::cerr << "couldn't open " << interface << std::endl; 
    172     return 1; 
    173   } 
    174  
    175   std::vector<op_id_reply_t> r = u2->find_usrps(); 
    176  
    177   for (size_t i = 0; i < r.size(); i++){ 
    178     std::cout << r[i] << std::endl; 
    179   } 
    180  
    181   if (r.size() == 0){ 
    182     std::cerr << "No USRP2 found.\n"; 
    183     return 1; 
    184   } 
    185  
    186   u2_mac_addr_t which = r[0].addr;      // pick the first one 
    187  
    188  
    189   usrp2_tune_result tune_result; 
     164 
     165  gruel::rt_status_t rt = gruel::enable_realtime_scheduling(); 
     166  if (rt != gruel::RT_OK) 
     167    std::cerr << "Failed to enable realtime scheduling" << std::endl; 
     168 
     169 
     170  usrp2::usrp2::sptr u2 = usrp2::usrp2::make(interface, mac_addr_str); 
    190171   
    191172  if (gain != GAIN_NOT_SET){ 
    192     if (!u2->set_tx_gain(which, gain)){ 
     173    if (!u2->set_tx_gain(gain)){ 
    193174      std::cerr << "set_tx_gain failed\n"; 
    194175      return 1; 
     
    196177  } 
    197178 
    198   if (!u2->set_tx_freq(which, freq, &tune_result)){ 
    199     std::cerr << "set_tx_freq failed\n"; 
    200     return 1; 
    201   } 
    202  
    203   if (!u2->set_tx_interp(which, interp)){ 
    204     std::cerr << "set_tx_interp failed\n"; 
    205     return 1; 
    206   } 
    207  
    208   if (!u2->set_tx_scale_iq(which, scale, scale)){ 
     179  usrp2::tune_result tr; 
     180  if (!u2->set_tx_center_freq(freq, &tr)){ 
     181    fprintf(stderr, "set_tx_center_freq(%g) failed\n", freq); 
     182    return 1; 
     183  } 
     184 
     185  printf("Daughterboard configuration:\n"); 
     186  printf("  baseband_freq=%f\n", tr.baseband_freq); 
     187  printf("       duc_freq=%f\n", tr.dxc_freq); 
     188  printf("  residual_freq=%f\n", tr.residual_freq); 
     189  printf("       inverted=%s\n\n", tr.spectrum_inverted ? "yes" : "no"); 
     190 
     191  if (!u2->set_tx_interp(interp)){ 
     192    fprintf(stderr, "set_tx_interp(%d) failed\n", interp); 
     193    return 1; 
     194  } 
     195 
     196  if (!u2->set_tx_scale_iq(scale, scale)){ 
    209197    std::cerr << "set_tx_scale_iq failed\n"; 
    210198    return 1; 
     
    212200 
    213201 
    214   u2_eth_samples_t      pkt; 
    215   u2p_set_word0(&pkt.hdrs.fixed, U2P_TX_IMMEDIATE | U2P_TX_START_OF_BURST, 0); 
    216   u2p_set_timestamp(&pkt.hdrs.fixed, T_NOW); 
     202  usrp2::tx_metadata    md; 
     203  md.timestamp = -1; 
     204  md.start_of_burst = 1; 
     205  md.send_now = 1; 
    217206 
    218207  while (1){ 
    219208 
    220     int r = fread(&pkt.samples, sizeof(uint32_t), samples_per_frame, fp); 
     209    std::complex<int16_t> samples[MAX_SAMPLES]; 
     210 
     211    int r = fread(samples, sizeof(uint32_t), samples_per_frame, fp); 
    221212 
    222213    // fprintf(stderr, "fread -> %d\n", r); 
     
    231222    // FIXME if r < 9, pad to 9 for minimum packet size constraint 
    232223 
    233     if (!u2->write_samples(which, &pkt, r)) 
     224    if (!u2->tx_complex_int16(0, samples, samples_per_frame, &md)) 
    234225      break; 
    235226  }