four_multi
Multi-Antenna,Multi-Node,Multi-Band,Multi-Cell
core/super_node.cpp
00001 // Copyright 2011-2013, Per Zetterberg, KTH Royal Institute of Technology
00002 //
00003 // This program is free software: you can redistribute it and/or modify
00004 // it under the terms of the GNU General Public License as published by
00005 // the Free Software Foundation, either version 3 of the License, or
00006 // (at your option) any later version.
00007 //
00008 // This program is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011 // GNU General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00015 //
00016 
00017 
00018 #include <fstream> 
00019 #include <uhd/device.hpp>
00020 #include <uhd/utils/thread_priority.hpp>
00021 #include <uhd/utils/safe_main.hpp>
00022 #include <uhd/usrp/multi_usrp.hpp>
00023 #include <boost/program_options.hpp>
00024 #include <boost/format.hpp>
00025 #include <iostream>
00026 #include <complex>
00027 #include <uhd/types/clock_config.hpp>
00028 #include "gps.hpp"
00029 #include <uhd/usrp/subdev_spec.hpp>
00030 #include "four_multi.hpp"
00031 #include "super_node.hpp"
00032 #include <uhd/types/ranges.hpp>
00033 #include "get_usrp2_ip_addr.hpp"
00034 #include <boost/thread/thread.hpp>
00035 #include <iostream>
00036 #include <boost/asio/io_service.hpp>
00037 #include <boost/asio/serial_port.hpp>
00038 #include <boost/thread/thread.hpp>
00039 #include <boost/asio/socket_base.hpp>
00040 #include <boost/asio/ip/address.hpp>
00041 #include <boost/asio/ip/tcp.hpp>
00042 #include <boost/asio/write.hpp>
00043 #include <boost/asio/buffer.hpp>
00044 
00045 
00046 using namespace boost::asio::ip;
00047 using boost::asio::ip::tcp;
00048 using namespace std;
00049 
00050 namespace po = boost::program_options;
00051 using namespace boost;
00052 
00054 class node_process_class {
00055    public:
00056      
00057      void operator()(void){
00058        *fp=p_four_multi->node_process();
00059      };
00060 
00061       
00062      four_multi_node *p_four_multi;
00063      frame_settings *fp;
00064 
00065 
00066 
00067 };
00068 
00069 
00070 super_node::super_node(uint32_t no_ant1, 
00071                          uint32_t no_ant2 , bool use_external_10MHz,
00072                        bool use_same_antenna, //uint32_t node_ix, 
00073                        //std::vector<std::string> IP_addresses,
00074                        uint32_t skip_ant ,std::vector<four_multi_node*> *nodes) 
00075   : four_multi_node(no_ant1,no_ant2,true,use_same_antenna,0,
00076 std::vector<std::string> (),false,skip_ant)
00077 {
00078   d_nodes=nodes;
00079   do_override=false;
00080 
00081 
00082 
00083   int new_buffer_length=(*nodes)[0]->d_buffer_length;
00084   int i2;
00085   for (int i1=1;(unsigned int ) i1<(*d_nodes).size();i1++) {
00086     i2=(*d_nodes)[i1]->d_buffer_length;
00087     if (!(i2==new_buffer_length)) {
00088       std::cerr << "All constituent nodes of super_node must have the same buffer_length \n";
00089       exit(1);
00090     };
00091   };
00092   init(new_buffer_length);
00093 };
00094 
00095 
00096 super_node::super_node(uint32_t no_ant1, 
00097                          uint32_t no_ant2 , bool use_external_10MHz,
00098              bool use_same_antenna, 
00099                        // std::vector<std::string> IP_addresses,
00100               uint32_t skip_ant ,std::vector<four_multi_node*> *nodes,
00101               std::vector<double> override_gain_rx, 
00102               std::vector<double> override_gain_tx, 
00103                        std::vector<double> override_frequency) :
00104 four_multi_node(no_ant1,no_ant2,true,use_same_antenna,0,
00105 std::vector<std::string> (),
00106 false,skip_ant)
00107 {
00108   d_nodes=nodes;
00109   do_override=true;
00110   d_override_gain_rx= override_gain_rx;
00111   d_override_gain_tx=override_gain_tx;
00112   d_override_frequency=override_frequency;
00113 
00114   int new_buffer_length=(*nodes)[0]->d_buffer_length;
00115   int i2;
00116   for (int i1=1;(unsigned int ) i1<(*d_nodes).size();i1++) {
00117     i2=(*d_nodes)[i1]->d_buffer_length;
00118     if (!(i2==new_buffer_length)) {
00119       std::cerr << "All constituent nodes of super_node must have the same buffer_length \n";
00120       exit(1);
00121     };
00122   };
00123   init(new_buffer_length);
00124 };
00125 
00126 
00127 
00128 
00129 
00130 frame_settings super_node::node_init(void) {
00131 
00132   frame_settings frame,f;
00133   std::vector<double> gain_rx_vec(d_no_ant);
00134   std::vector<double> gain_tx_vec(d_no_ant);
00135   std::vector<double> freq_vec(d_no_ant);  
00136   
00137   
00138   uint32_t i2=0;
00139   uint32_t i30=0;
00140   uint32_t i4;
00141   for (uint32_t i1=0;i1<(*d_nodes).size();i1++) {
00142     for (uint32_t i3=0;i3<(*d_nodes)[i1]->d_no_ant;i3++) {
00143       (*d_nodes)[i1]->d_tx_buffers[i3]=d_tx_buffers[i2];
00144       (*d_nodes)[i1]->d_rx_buffers[i3]=d_rx_buffers[i2];
00145       i2++;
00146     };
00147     (*d_nodes)[i1]->d_simulate=true;
00148     (*d_nodes)[i1]->no_rx_buffer_stored_so_far=0;
00149     f=(*d_nodes)[i1]->node_init();
00150 
00151     if (!do_override) {
00152       for (uint32_t i3=0;i3<(*d_nodes)[i1]->d_no_ant;i3++) {
00153         i4=min(i3,(uint32_t) f.gain_rx.size()-1);
00154         gain_rx_vec[i3+i30]=f.gain_rx[i4];
00155         i4=min(i3,(uint32_t) f.gain_tx.size()-1);
00156         gain_tx_vec[i3+i30]=f.gain_tx[i4];
00157         i4=min(i3,(uint32_t) f.frequency.size()-1);
00158         freq_vec[i3+i30]=f.frequency[i4];
00159       };
00160       frame.gain_rx=gain_rx_vec;
00161       frame.gain_tx=gain_tx_vec;
00162       frame.frequency=freq_vec;
00163     } else {
00164       frame.gain_rx=d_override_gain_rx;
00165       frame.gain_tx=d_override_gain_tx;
00166       frame.frequency=d_override_frequency;
00167     };
00168 
00169     frame.time=f.time;
00170     frame.what=f.what;
00171     frame.small_buffer_length=f.small_buffer_length;
00172     frame.tx_repeats=f.tx_repeats;
00173 
00174 
00175     i30=i2;
00176     (*d_nodes)[i1]->d_simulate=false;
00177   };
00178  
00179   return frame;
00180 
00181 };
00182 frame_settings super_node::node_process(void) { 
00183 
00184   frame_settings frame,f1,f2,f3;
00185   std::vector<double> gain_rx_vec(d_no_ant);
00186   std::vector<double> gain_tx_vec(d_no_ant);
00187   std::vector<double> freq_vec(d_no_ant);  
00188 
00189   for (uint32_t i1=0;i1<(*d_nodes).size();i1++) {
00190      (*d_nodes)[i1]->d_old_frame_settings=d_old_frame_settings;
00191   };
00192 
00193   node_process_class n0p;
00194   n0p.p_four_multi=(*d_nodes)[0];
00195   n0p.fp=&f1;
00196   boost::thread n0t(n0p);
00197   if ((*d_nodes).size()>1) {
00198     node_process_class n1p;
00199     n1p.p_four_multi=(*d_nodes)[1];
00200     n1p.fp=&f2;
00201     boost::thread n1t(n1p);
00202     if ((*d_nodes).size()>2) {
00203        node_process_class n2p;
00204        n2p.p_four_multi=(*d_nodes)[2];
00205        n2p.fp=&f3;
00206        boost::thread n2t(n2p);
00207        if ((*d_nodes).size()>3) {
00208           cerr << "super_node can only take max 3 subnodes \n";
00209        };
00210        n2t.join();
00211     };
00212     n1t.join();
00213   };
00214   n0t.join();
00215 
00216   frame.what=f1.what;
00217 
00218   frame.tx_repeats=f1.tx_repeats;
00219   frame.time=f1.time;
00220   frame.small_buffer_length=f1.small_buffer_length;
00221   std::cout << "inside super_node frame.small_buffer_length=" << frame.small_buffer_length << std::endl;
00222 
00223   int i4, i30;
00224   i30=0;
00225 
00226   for (uint32_t i3=0;i3<(*d_nodes)[0]->d_no_ant;i3++) {
00227     i4=min(i3,(uint32_t) f1.gain_rx.size()-1);
00228     gain_rx_vec[i3+i30]=f1.gain_rx[i4];
00229     i4=min(i3,(uint32_t) f1.gain_tx.size()-1);
00230     gain_tx_vec[i3+i30]=f1.gain_tx[i4];
00231     i4=min(i3,(uint32_t) f1.frequency.size()-1);
00232     freq_vec[i3+i30]=f1.frequency[i4];
00233   };
00234   i30=i30+(*d_nodes)[0]->d_no_ant;
00235   if ((*d_nodes).size()>1) {
00236     for (uint32_t i3=0;i3<(*d_nodes)[1]->d_no_ant;i3++) {
00237       i4=min(i3,(uint32_t) f2.gain_rx.size()-1);
00238       gain_rx_vec[i3+i30]=f2.gain_rx[i4];
00239       i4=min(i3,(uint32_t) f2.gain_tx.size()-1);
00240       gain_tx_vec[i3+i30]=f2.gain_tx[i4];
00241       i4=min(i3,(uint32_t) f2.frequency.size()-1);
00242       freq_vec[i3+i30]=f2.frequency[i4];
00243     };
00244    i30=i30+(*d_nodes)[1]->d_no_ant;
00245   };
00246   if ((*d_nodes).size()>2) {
00247     for (uint32_t i3=0;i3<(*d_nodes)[2]->d_no_ant;i3++) {
00248       i4=min(i3,(uint32_t) f3.gain_rx.size()-1);
00249       gain_rx_vec[i3+i30]=f3.gain_rx[i4];
00250       i4=min(i3,(uint32_t) f3.gain_tx.size()-1);
00251       gain_tx_vec[i3+i30]=f3.gain_tx[i4];
00252       i4=min(i3,(uint32_t) f3.frequency.size()-1);
00253       freq_vec[i3+i30]=f3.frequency[i4];
00254     };
00255    i30=i30+(*d_nodes)[2]->d_no_ant;
00256   };
00257 
00258   if (!do_override) {
00259     frame.gain_rx=gain_rx_vec;
00260     frame.gain_tx=gain_tx_vec;
00261     frame.frequency=freq_vec;
00262   }
00263   else  {
00264     frame.gain_rx=d_override_gain_rx;
00265     frame.gain_tx=d_override_gain_tx;
00266     frame.frequency=d_override_frequency;    
00267   };
00268 
00269 
00270   //  std::cout << "heeej d_old_frame_settings.small_buffer_length=" << d_old_frame_settings.small_buffer_length << std::endl;
00271 
00272   if (d_old_frame_settings.what==RX) {
00273     for (uint32_t i1=0;i1<(*d_nodes).size();i1++) {
00274       if ((*d_nodes)[i1]->save_input_on_file) {
00275         if (d_old_frame_settings.small_buffer_length!=0) {
00276           (*d_nodes)[i1]->
00277             log_raw_buffer(d_old_frame_settings.small_buffer_length);
00278         } else {
00279           (*d_nodes)[i1]->log_raw_buffer(d_buffer_length);
00280          };
00281       };
00282     };
00283   };     
00284 
00285   return frame;
00286 
00287 };
00288 void super_node::end_of_run(void) {  
00289   for (uint32_t i1=0;i1<(*d_nodes).size();i1++) {
00290     if ((*d_nodes)[i1]->save_input_on_file) {
00291       (*d_nodes)[i1]->save_logged_raw_data();
00292     };    
00293     (*d_nodes)[i1]->end_of_run();
00294   };
00295 };
00296 
00297 
00298 
00299 
00300 
 All Classes Functions Variables