![]() |
four_multi
Multi-Antenna,Multi-Node,Multi-Band,Multi-Cell
|
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