USRP_Server  2.0
A flexible, GPU-accelerated radio-frequency readout software.
USRP_JSON_interpreter.cpp
Go to the documentation of this file.
2 
3 //this function will read the arrays inside a json file and put them in a std vector.
4 template <typename T>
5 std::vector<T> as_vector(boost::property_tree::ptree const& pt,
6  boost::property_tree::ptree::key_type const& key,
7  boost::property_tree::ptree::key_type const& sub_key
8  ){
9  std::vector<T> r;
10  if (sub_key == "NULL"){
11  for (auto& item : pt.get_child(key)) r.push_back(item.second.get_value<T>());
12  }else{
13  for (auto& item : pt.get_child(key).get_child(sub_key)) r.push_back(item.second.get_value<T>());
14  }
15  return r;
16 }
17 
18 //convert a json string into a parameter object
19 bool string2param(std::string data, usrp_param &my_parameter){
20  short device;
21 
22  std::stringstream serial_json(data);
23 
24  boost::property_tree::ptree parameters;
25 
26  try{
27  boost::property_tree::read_json(serial_json, parameters);
28  device = parameters.get<int>("device");
29  std::cout << "Setting parameters for USRP # " << device <<std::endl;
30  my_parameter.usrp_number = device;
31 
32  }catch (boost::exception &error){
33  std::cerr <<boost::diagnostic_information(error)<< std::endl;
34  print_error("missing device ID or wrong JSON string");
35  return false;
36  }
37 
38  try{
39  my_parameter.A_TXRX.mode = ant_mode_from_string( parameters.get_child("A_TXRX").get<std::string>("mode"));
40  my_parameter.B_TXRX.mode = ant_mode_from_string( parameters.get_child("B_TXRX").get<std::string>("mode"));
41  my_parameter.A_RX2.mode = ant_mode_from_string( parameters.get_child("A_RX2").get<std::string>("mode"));
42  my_parameter.B_RX2.mode = ant_mode_from_string( parameters.get_child("B_RX2").get<std::string>("mode"));
43  }catch(std::exception& error){
44  std::cout << error.what()<<std::endl;
45  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"mode\" match the specifications!");
46  return false;
47  }
48  try{
49  my_parameter.A_TXRX.tone = parameters.get_child("A_TXRX").get<double>("rf");
50  my_parameter.B_TXRX.tone = parameters.get_child("B_TXRX").get<double>("rf");
51  my_parameter.A_RX2.tone = parameters.get_child("A_RX2").get<double>("rf");
52  my_parameter.B_RX2.tone = parameters.get_child("B_RX2").get<double>("rf");
53  }catch(std::exception& error){
54  std::cout << error.what()<<std::endl;
55  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"rf\" match the specifications!");
56  return false;
57  }
58  try{
59  my_parameter.A_TXRX.tuning_mode = parameters.get_child("A_TXRX").get<size_t>("tuning_mode");
60  my_parameter.B_TXRX.tuning_mode = parameters.get_child("B_TXRX").get<size_t>("tuning_mode");
61  my_parameter.A_RX2.tuning_mode = parameters.get_child("A_RX2").get<size_t>("tuning_mode");
62  my_parameter.B_RX2.tuning_mode = parameters.get_child("B_RX2").get<size_t>("tuning_mode");
63  }catch(std::exception& error){
64  std::cout << error.what()<<std::endl;
65  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"tuning_mode\" match the specifications!");
66  return false;
67  }
68  try{
69  my_parameter.A_TXRX.rate = parameters.get_child("A_TXRX").get<double>("rate");
70  my_parameter.B_TXRX.rate = parameters.get_child("B_TXRX").get<double>("rate");
71  my_parameter.A_RX2.rate = parameters.get_child("A_RX2").get<double>("rate");
72  my_parameter.B_RX2.rate = parameters.get_child("B_RX2").get<double>("rate");
73  }catch(std::exception& error){
74  std::cout << error.what()<<std::endl;
75  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"rate\" match the specifications!");
76  return false;
77  }
78  try{
79  my_parameter.A_TXRX.decim = parameters.get_child("A_TXRX").get<double>("decim");
80  my_parameter.B_TXRX.decim = parameters.get_child("B_TXRX").get<double>("decim");
81  my_parameter.A_RX2.decim = parameters.get_child("A_RX2").get<double>("decim");
82  my_parameter.B_RX2.decim = parameters.get_child("B_RX2").get<double>("decim");
83  }catch(std::exception& error){
84  std::cout << error.what()<<std::endl;
85  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"decim\" match the specifications!");
86  return false;
87  }
88  try{
89  my_parameter.A_TXRX.fft_tones = parameters.get_child("A_TXRX").get<double>("fft_tones");
90  my_parameter.B_TXRX.fft_tones = parameters.get_child("B_TXRX").get<double>("fft_tones");
91  my_parameter.A_RX2.fft_tones = parameters.get_child("A_RX2").get<double>("fft_tones");
92  my_parameter.B_RX2.fft_tones = parameters.get_child("B_RX2").get<double>("fft_tones");
93  }catch(std::exception& error){
94  std::cout << error.what()<<std::endl;
95  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"fft_tones\" match the specifications!");
96  return false;
97  }
98  try{
99  my_parameter.A_TXRX.pf_average = parameters.get_child("A_TXRX").get<double>("pf_average");
100  my_parameter.B_TXRX.pf_average = parameters.get_child("B_TXRX").get<double>("pf_average");
101  my_parameter.A_RX2.pf_average = parameters.get_child("A_RX2").get<double>("pf_average");
102  my_parameter.B_RX2.pf_average = parameters.get_child("B_RX2").get<double>("pf_average");
103  }catch(std::exception& error){
104  std::cout << error.what()<<std::endl;
105  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"pf_average\" match the specifications!");
106  return false;
107  }
108 
109  try{
110  my_parameter.A_TXRX.samples = parameters.get_child("A_TXRX").get<size_t>("samples");
111  my_parameter.B_TXRX.samples = parameters.get_child("B_TXRX").get<size_t>("samples");
112  my_parameter.A_RX2.samples = parameters.get_child("A_RX2").get<size_t>("samples");
113  my_parameter.B_RX2.samples = parameters.get_child("B_RX2").get<size_t>("samples");
114  }catch(std::exception& error){
115  std::cout << error.what()<<std::endl;
116  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"samples\" match the specifications!");
117  return false;
118  }
119  try{
120  my_parameter.A_TXRX.buffer_len = parameters.get_child("A_TXRX").get<double>("buffer_len");
121  my_parameter.B_TXRX.buffer_len = parameters.get_child("B_TXRX").get<double>("buffer_len");
122  my_parameter.A_RX2.buffer_len = parameters.get_child("A_RX2").get<double>("buffer_len");
123  my_parameter.B_RX2.buffer_len = parameters.get_child("B_RX2").get<double>("buffer_len");
124  }catch(std::exception& error){
125  std::cout << error.what()<<std::endl;
126  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"buffer_len\" match the specifications!");
127  return false;
128  }
129  try{
130  my_parameter.A_TXRX.burst_off = parameters.get_child("A_TXRX").get<double>("burst_off");
131  my_parameter.B_TXRX.burst_off = parameters.get_child("B_TXRX").get<double>("burst_off");
132  my_parameter.A_RX2.burst_off = parameters.get_child("A_RX2").get<double>("burst_off");
133  my_parameter.B_RX2.burst_off = parameters.get_child("B_RX2").get<double>("burst_off");
134  }catch(std::exception& error){
135  std::cout << error.what()<<std::endl;
136  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"burst_off\" match the specifications!");
137  return false;
138  }
139  try{
140  my_parameter.A_TXRX.burst_on = parameters.get_child("A_TXRX").get<double>("burst_on");
141  my_parameter.B_TXRX.burst_on = parameters.get_child("B_TXRX").get<double>("burst_on");
142  my_parameter.A_RX2.burst_on = parameters.get_child("A_RX2").get<double>("burst_on");
143  my_parameter.B_RX2.burst_on = parameters.get_child("B_RX2").get<double>("burst_on");
144  }catch(std::exception& error){
145  std::cout << error.what()<<std::endl;
146  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"burst_on\" match the specifications!");
147  return false;
148  }
149  try{
150  my_parameter.A_TXRX.bw = parameters.get_child("A_TXRX").get<double>("bw");
151  my_parameter.B_TXRX.bw = parameters.get_child("B_TXRX").get<double>("bw");
152  my_parameter.A_RX2.bw = parameters.get_child("A_RX2").get<double>("bw");
153  my_parameter.B_RX2.bw = parameters.get_child("B_RX2").get<double>("bw");
154  }catch(std::exception& error){
155  std::cout << error.what()<<std::endl;
156  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"bw\" match the specifications!");
157  return false;
158  }
159  try{
160  my_parameter.A_TXRX.delay = parameters.get_child("A_TXRX").get<double>("delay");
161  my_parameter.B_TXRX.delay = parameters.get_child("B_TXRX").get<double>("delay");
162  my_parameter.A_RX2.delay = parameters.get_child("A_RX2").get<double>("delay");
163  my_parameter.B_RX2.delay = parameters.get_child("B_RX2").get<double>("delay");
164  }catch(std::exception& error){
165  std::cout << error.what()<<std::endl;
166  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"delay\" match the specifications!");
167  return false;
168  }
169  try{
170  my_parameter.A_TXRX.gain = parameters.get_child("A_TXRX").get<double>("gain");
171  my_parameter.B_TXRX.gain = parameters.get_child("B_TXRX").get<double>("gain");
172  my_parameter.A_RX2.gain = parameters.get_child("A_RX2").get<double>("gain");
173  my_parameter.B_RX2.gain = parameters.get_child("B_RX2").get<double>("gain");
174  }catch(std::exception& error){
175  std::cout << error.what()<<std::endl;
176  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"gain\" match the specifications!");
177  return false;
178  }
179  try{
180  my_parameter.A_TXRX.freq = as_vector<int>(parameters, "A_TXRX","freq");
181  my_parameter.B_TXRX.freq = as_vector<int>(parameters, "B_TXRX","freq");
182  my_parameter.A_RX2.freq = as_vector<int>(parameters, "A_RX2","freq");
183  my_parameter.B_RX2.freq = as_vector<int>(parameters, "B_RX2","freq");
184  }catch(std::exception& error){
185  std::cout << error.what()<<std::endl;
186  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"frequency\" match the specifications!");
187  return false;
188  }
189  try{
190  my_parameter.A_TXRX.ampl = as_vector<float>(parameters, "A_TXRX","ampl");
191  my_parameter.B_TXRX.ampl = as_vector<float>(parameters, "B_TXRX","ampl");
192  my_parameter.A_RX2.ampl = as_vector<float>(parameters, "A_RX2","ampl");
193  my_parameter.B_RX2.ampl = as_vector<float>(parameters, "B_RX2","ampl");
194  }catch(std::exception& error){
195  std::cout << error.what()<<std::endl;
196  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"amplitude\" match the specifications!");
197  return false;
198  }
199  try{
200  my_parameter.A_TXRX.wave_type = string_to_w_type_vector( as_vector<std::string>(parameters, "A_TXRX","wave_type") );
201  my_parameter.B_TXRX.wave_type = string_to_w_type_vector(as_vector<std::string>(parameters, "B_TXRX","wave_type") );
202  my_parameter.A_RX2.wave_type = string_to_w_type_vector(as_vector<std::string>(parameters, "A_RX2","wave_type") );
203  my_parameter.B_RX2.wave_type = string_to_w_type_vector(as_vector<std::string>(parameters, "B_RX2","wave_type") );
204  }catch(std::exception& error){
205  std::cout << error.what()<<std::endl;
206  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"wave_type\" match the specifications!");
207  return false;
208  }
209  try{
210  my_parameter.A_TXRX.chirp_t = as_vector<float>(parameters, "A_TXRX","chirp_t");
211  my_parameter.B_TXRX.chirp_t = as_vector<float>(parameters, "B_TXRX","chirp_t");
212  my_parameter.A_RX2.chirp_t = as_vector<float>(parameters, "A_RX2","chirp_t");
213  my_parameter.B_RX2.chirp_t = as_vector<float>(parameters, "B_RX2","chirp_t");
214  }catch(std::exception& error){
215  std::cout << error.what()<<std::endl;
216  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"chirp_t\" match the specifications!");
217  return false;
218  }
219  try{
220  my_parameter.A_TXRX.chirp_f = as_vector<int>(parameters, "A_TXRX","chirp_f");
221  my_parameter.B_TXRX.chirp_f = as_vector<int>(parameters, "B_TXRX","chirp_f");
222  my_parameter.A_RX2.chirp_f = as_vector<int>(parameters, "A_RX2","chirp_f");
223  my_parameter.B_RX2.chirp_f = as_vector<int>(parameters, "B_RX2","chirp_f");
224  }catch(std::exception& error){
225  std::cout << error.what()<<std::endl;
226  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"chirp_f\" match the specifications!");
227  return false;
228  }
229  try{
230  my_parameter.A_TXRX.swipe_s = as_vector<int>(parameters, "A_TXRX","swipe_s");
231  my_parameter.B_TXRX.swipe_s = as_vector<int>(parameters, "B_TXRX","swipe_s");
232  my_parameter.A_RX2.swipe_s = as_vector<int>(parameters, "A_RX2","swipe_s");
233  my_parameter.B_RX2.swipe_s = as_vector<int>(parameters, "B_RX2","swipe_s");
234  }catch(std::exception& error){
235  std::cout << error.what()<<std::endl;
236  print_error("could not parse the JSON file correctly: be sure that the data type used for descriptor \"swipe_s\" match the specifications!");
237  return false;
238  }
239 
240  //block just added follows:
241  try{
242  my_parameter.A_TXRX.data_mem_mult = parameters.get_child("A_TXRX").get<double>("data_mem_mult");
243  my_parameter.B_TXRX.data_mem_mult = parameters.get_child("B_TXRX").get<double>("data_mem_mult");
244  my_parameter.A_RX2.data_mem_mult = parameters.get_child("A_RX2").get<double>("data_mem_mult");
245  my_parameter.B_RX2.data_mem_mult = parameters.get_child("B_RX2").get<double>("data_mem_mult");
246  }catch(std::exception& error){
247  std::cout << error.what()<<std::endl;
248  print_error("could not parse the JSON file correctly: be sure that the data type used\
249  for descriptor \"data_mem_mult\" match the specifications!");
250  return false;
251  }
252  //end of the block
253 
254  std::cout<<"printing parameters..."<<std::endl;
255  return true;
256 
257 }
258 
259 bool is_pfb_active(param ant_parameter){
260  bool res = false;
261  for(size_t i = 0; i< ant_parameter.wave_type.size(); i++){
262  if(ant_parameter.wave_type[i] == TONES or ant_parameter.wave_type[i] == NOISE)res = true;
263  }
264  return res;
265 }
266 
267 //check if the parameters are physically viable
268 bool chk_param(usrp_param *parameter){
269 
270 
271  if(parameter->A_TXRX.mode != OFF){
272 
273  if(is_pfb_active(parameter->A_TXRX)){
274  if(parameter->A_TXRX.pf_average <= 0)parameter->A_TXRX.pf_average = 1;
275  if(parameter->A_TXRX.fft_tones <= 0){
276  parameter->A_TXRX.fft_tones = 2;
277  std::stringstream ss;
278  ss<<"number of fft bins in A_TXRX is too low. Setting it to 2.";
279  print_warning(ss.str());
280  }
281  }
282  if(parameter->A_TXRX.buffer_len == 0)parameter->A_TXRX.buffer_len = DEFAULT_BUFFER_LEN;
283  if(parameter->A_TXRX.buffer_len > MAX_USEFULL_BUFFER or parameter->A_TXRX.buffer_len < MIN_USEFULL_BUFFER){
284  std::stringstream ss;
285  ss<<"A_TXRX buffer length was set to "<<parameter->A_TXRX.buffer_len<<" smples. This value is out of limits ["<< MIN_USEFULL_BUFFER<<","<< MAX_USEFULL_BUFFER<<"]. Reset the buffer length to default: "<<DEFAULT_BUFFER_LEN ;
286  print_warning(ss.str());
287  parameter->A_TXRX.buffer_len = DEFAULT_BUFFER_LEN;
288  }
289  for(size_t i=0; i< parameter->A_TXRX.wave_type.size(); i++){
290  try{
291  if(parameter->A_TXRX.wave_type[i] == CHIRP or parameter->A_TXRX.wave_type[i] == TONES){
292  if(std::abs(parameter->A_TXRX.freq.at(i)) > parameter->A_TXRX.rate){
293  std::stringstream ss;
294  ss<< "frequency descriptor "<< i <<" in \'A_TXRX\' parameter is out of Nyquist range: "<< parameter->A_TXRX.freq.at(i)<<">"<<parameter->A_TXRX.rate;
295  print_error(ss.str());
296  return false;
297  }
298  }
299  if(parameter->A_TXRX.wave_type[i] == CHIRP){
300  if(std::abs(parameter->A_TXRX.chirp_f.at(i)) > parameter->A_TXRX.rate){
301  std::stringstream ss;
302  ss<< "second frequency descriptor "<< i <<" in \'A_TXRX\' parameter is out of Nyquist range: "<< parameter->A_TXRX.chirp_f.at(i)<<">"<<parameter->A_TXRX.rate;
303  print_error(ss.str());
304  return false;
305  }
306  }
307  }catch(const std::out_of_range& e){
308  print_error("Number of frequency descriptor does not match the number of signal mode descriptor in parameter \'A_TXRX\'");
309  return false;
310  }
311  }
312  }
313 
314  if(parameter->B_TXRX.mode != OFF){
315 
316  if(is_pfb_active(parameter->B_TXRX)){
317  if(parameter->B_TXRX.pf_average <= 0)parameter->B_TXRX.pf_average = 1;
318  if(parameter->B_TXRX.fft_tones <= 0){
319  parameter->B_TXRX.fft_tones = 2;
320  std::stringstream ss;
321  ss<<"number of fft bins in B_TXRX is too low. Setting it to 2.";
322  print_warning(ss.str());
323  }
324  }
325  if(parameter->B_TXRX.buffer_len == 0)parameter->B_TXRX.buffer_len = DEFAULT_BUFFER_LEN;
326  if(parameter->B_TXRX.buffer_len > MAX_USEFULL_BUFFER or parameter->B_TXRX.buffer_len < MIN_USEFULL_BUFFER){
327  std::stringstream ss;
328  ss<<"B_TXRX buffer length was set to "<<parameter->B_TXRX.buffer_len<<" smples. This value is out of limits ["<< MIN_USEFULL_BUFFER<<","<< MAX_USEFULL_BUFFER<<"]. Reset the buffer length to default: "<<DEFAULT_BUFFER_LEN ;
329  print_warning(ss.str());
330  parameter->B_TXRX.buffer_len = DEFAULT_BUFFER_LEN;
331  }
332  for(size_t i=0; i< parameter->B_TXRX.wave_type.size(); i++){
333  try{
334  if(parameter->B_TXRX.wave_type[i] == CHIRP or parameter->B_TXRX.wave_type[i] == TONES){
335  if(std::abs(parameter->B_TXRX.freq.at(i)) > parameter->B_TXRX.rate){
336  std::stringstream ss;
337  ss<< "frequency descriptor "<< i <<" in \'B_TXRX\' parameter is out of Nyquist range: "<< parameter->B_TXRX.freq.at(i)<<">"<<parameter->B_TXRX.rate;
338  print_error(ss.str());
339  return false;
340  }
341  }
342  if(parameter->B_TXRX.wave_type[i] == CHIRP){
343  if(std::abs(parameter->B_TXRX.chirp_f.at(i)) > parameter->B_TXRX.rate){
344  std::stringstream ss;
345  ss<< "second frequency descriptor "<< i <<" in \'B_TXRX\' parameter is out of Nyquist range: "<< parameter->B_TXRX.chirp_f.at(i)<<">"<<parameter->B_TXRX.rate;
346  print_error(ss.str());
347  return false;
348  }
349  }
350  }catch(const std::out_of_range& e){
351  print_error("Number of frequency descriptor does not match the number of signal mode descriptor in parameter \'B_TXRX\'");
352  return false;
353  }
354  }
355  }
356  if(parameter->A_RX2.mode != OFF){
357  if(is_pfb_active(parameter->A_RX2)){
358  if(parameter->A_RX2.pf_average <= 0)parameter->A_RX2.pf_average = 1;
359  if(parameter->A_RX2.fft_tones <= 0){
360  parameter->A_RX2.fft_tones = 2;
361  std::stringstream ss;
362  ss<<"number of fft bins in A_TXRX is too low. Setting it to 2.";
363  print_warning(ss.str());
364  }
365  }
366  if(parameter->A_RX2.buffer_len == 0)parameter->A_RX2.buffer_len = DEFAULT_BUFFER_LEN;
367  if(parameter->A_RX2.buffer_len > MAX_USEFULL_BUFFER or parameter->A_RX2.buffer_len < MIN_USEFULL_BUFFER){
368  std::stringstream ss;
369  ss<<"A_RX2 buffer length was set to "<<parameter->A_RX2.buffer_len<<" smples. This value is out of limits ["<< MIN_USEFULL_BUFFER<<","<< MAX_USEFULL_BUFFER<<"]. Reset the buffer length to default: "<<DEFAULT_BUFFER_LEN ;
370  print_warning(ss.str());
371  parameter->A_RX2.buffer_len = DEFAULT_BUFFER_LEN;
372  }
373  for(size_t i=0; i< parameter->A_RX2.wave_type.size(); i++){
374  try{
375  if(parameter->A_RX2.wave_type[i] == CHIRP or parameter->A_RX2.wave_type[i] == TONES){
376  if(std::abs(parameter->A_RX2.freq.at(i)) > parameter->A_RX2.rate){
377  std::stringstream ss;
378  ss<< "frequency descriptor "<< i <<" in \'A_RX2\' parameter is out of Nyquist range: "<< parameter->A_RX2.freq.at(i)<<">"<<parameter->A_RX2.rate;
379  print_error(ss.str());
380  return false;
381  }
382  }
383  if(parameter->A_RX2.wave_type[i] == CHIRP){
384  if(std::abs(parameter->A_RX2.chirp_f.at(i)) > parameter->A_RX2.rate){
385  std::stringstream ss;
386  ss<< "second frequency descriptor "<< i <<" in \'A_RX2\' parameter is out of Nyquist range: "<< parameter->A_RX2.chirp_f.at(i)<<">"<<parameter->A_RX2.rate;
387  print_error(ss.str());
388  return false;
389  }
390  }
391  }catch(const std::out_of_range& e){
392  print_error("Number of frequency descriptor does not match the number of signal mode descriptor in parameter \'A_RX2\'");
393  return false;
394  }
395  }
396  }
397  if(parameter->B_RX2.mode != OFF){
398  if(is_pfb_active(parameter->B_RX2)){
399  if(parameter->B_RX2.pf_average <= 0)parameter->B_RX2.pf_average = 1;
400  if(parameter->B_RX2.fft_tones <= 0){
401  parameter->B_RX2.fft_tones = 2;
402  std::stringstream ss;
403  ss<<"number of fft bins in A_TXRX is too low. Setting it to 2.";
404  print_warning(ss.str());
405  }
406  }
407  if(parameter->B_RX2.buffer_len == 0)parameter->B_RX2.buffer_len = DEFAULT_BUFFER_LEN;
408  if(parameter->B_RX2.buffer_len > MAX_USEFULL_BUFFER or parameter->B_RX2.buffer_len < MIN_USEFULL_BUFFER){
409  std::stringstream ss;
410  ss<<"B_RX2 buffer length was set to "<<parameter->B_RX2.buffer_len<<" smples. This value is out of limits ["<< MIN_USEFULL_BUFFER<<","<< MAX_USEFULL_BUFFER<<"]. Reset the buffer length to default: "<<DEFAULT_BUFFER_LEN ;
411  print_warning(ss.str());
412  parameter->B_RX2.buffer_len = DEFAULT_BUFFER_LEN;
413  }
414  for(size_t i=0; i< parameter->B_RX2.wave_type.size(); i++){
415  try{
416  if(parameter->B_RX2.wave_type[i] == CHIRP or parameter->B_RX2.wave_type[i] == TONES){
417  if(std::abs(parameter->B_RX2.freq.at(i)) > parameter->B_RX2.rate){
418  std::stringstream ss;
419  ss<< "frequency descriptor "<< i <<" in \'B_RX2\' parameter is out of Nyquist range: "<< parameter->B_RX2.freq.at(i)<<">"<<parameter->B_RX2.rate;
420  print_error(ss.str());
421  return false;
422  }
423  }
424  if(parameter->B_RX2.wave_type[i] == CHIRP){
425  if(std::abs(parameter->B_RX2.chirp_f.at(i)) > parameter->B_RX2.rate){
426  std::stringstream ss;
427  ss<< "second frequency descriptor "<< i <<" in \'B_RX2\' parameter is out of Nyquist range: "<< parameter->B_RX2.chirp_f.at(i)<<">"<<parameter->B_RX2.rate;
428  print_error(ss.str());
429  return false;
430  }
431  }
432  }catch(const std::out_of_range& e){
433  print_error("Number of frequency descriptor does not match the number of signal mode descriptor in parameter \'B_RX2\'");
434  return false;
435  }
436  }
437  }
438  return true;
439 }
440 
441 std::string server_ack(std::string payload){
442  std::stringstream res;
443  boost::property_tree::ptree response;
444  response.put("type","ack");
445  response.put("payload",payload);
446  boost::property_tree::write_json(res,response);
447  return res.str();
448 }
449 
450 std::string server_nack(std::string payload){
451  std::stringstream res;
452  boost::property_tree::ptree response;
453  response.put("type","nack");
454  response.put("payload",payload);
455  boost::property_tree::write_json(res,response);
456  return res.str();
457 }
bool string2param(std::string data, usrp_param &my_parameter)
bool is_pfb_active(param ant_parameter)
std::string server_ack(std::string payload)
bool chk_param(usrp_param *parameter)
void print_error(std::string text)
std::string server_nack(std::string payload)
ant_mode ant_mode_from_string(std::string str)
std::vector< w_type > string_to_w_type_vector(std::vector< std::string > string_vector)
void print_warning(std::string text)
std::vector< T > as_vector(boost::property_tree::ptree const &pt, boost::property_tree::ptree::key_type const &key, boost::property_tree::ptree::key_type const &sub_key)