Changeset 9121
- Timestamp:
- 08/01/08 02:49:23
- 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 29 29 noinst_PROGRAMS = \ 30 30 gen_const \ 31 test2_usrp2 31 test2_usrp2 \ 32 tx_samples 32 33 33 34 find_usrps = find_usrps.cc 34 35 test2_usrp2_SOURCES = test2_usrp2.cc 35 36 gen_const_SOURCES = gen_const.cc 37 tx_samples_SOURCES = tx_samples.cc usrp2/branches/developers/eb/merge-wip/host-ng/apps/tx_samples.cc
r9118 r9121 1 1 /* -*- c++ -*- */ 2 2 /* 3 * Copyright 2007 Free Software Foundation, Inc.3 * Copyright 2007,2008 Free Software Foundation, Inc. 4 4 * 5 5 * This program is free software: you can redistribute it and/or modify … … 20 20 #include "config.h" 21 21 #endif 22 #include "usrp2_basic.h" 22 #include <usrp2/usrp2.h> 23 #include <usrp2/strtod_si.h> 23 24 #include <iostream> 24 25 #include <complex> 25 26 #include <getopt.h> 26 #include <gr_realtime.h> 27 #include "strtod_si.h" 28 29 #define T_NOW (-1) 27 #include <gruel/realtime.h> 30 28 31 29 typedef std::complex<float> fcomplex; 32 33 30 34 31 static const char * … … 58 55 fprintf(stderr, " -i INTERP set interpolation rate to INTERP [default=32]\n"); 59 56 fprintf(stderr, " -g gain set tx gain\n"); 60 fprintf(stderr, " -F SAMPLES_PER_FRAME number of samples in each frame [default=371]\n");61 57 fprintf(stderr, " -S SCALE fpga scaling factor for I & Q [default=256]\n"); 62 58 } 63 59 64 60 #define GAIN_NOT_SET (-1000) 61 #define MAX_SAMPLES (371) 65 62 66 63 int … … 70 67 const char *input_filename = 0; 71 68 bool repeat = false; 72 const char *mac_addr_str = 0;69 const char *mac_addr_str = ""; 73 70 double freq = 0; 74 71 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; 77 74 double gain = GAIN_NOT_SET; 78 75 79 76 int ch; 80 77 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){ 84 81 switch (ch){ 85 82 … … 90 87 case 'm': 91 88 mac_addr_str = optarg; 89 #if 0 92 90 if (!usrp2_basic::parse_mac_addr(optarg, &mac_addr)){ 93 91 std::cerr << "invalid mac addr: " << optarg << std::endl; … … 95 93 return 1; 96 94 } 95 #endif 97 96 break; 98 97 … … 143 142 } 144 143 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 145 153 FILE *fp = 0; 146 154 if (input_filename == 0) … … 154 162 } 155 163 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); 190 171 191 172 if (gain != GAIN_NOT_SET){ 192 if (!u2->set_tx_gain( which,gain)){173 if (!u2->set_tx_gain(gain)){ 193 174 std::cerr << "set_tx_gain failed\n"; 194 175 return 1; … … 196 177 } 197 178 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)){ 209 197 std::cerr << "set_tx_scale_iq failed\n"; 210 198 return 1; … … 212 200 213 201 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; 217 206 218 207 while (1){ 219 208 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); 221 212 222 213 // fprintf(stderr, "fread -> %d\n", r); … … 231 222 // FIXME if r < 9, pad to 9 for minimum packet size constraint 232 223 233 if (!u2-> write_samples(which, &pkt, r))224 if (!u2->tx_complex_int16(0, samples, samples_per_frame, &md)) 234 225 break; 235 226 }
