A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
spectrum-analyzer-helper.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010 CTTC
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Nicola Baldo <nbaldo@cttc.es>
19  */
20 #include "ns3/propagation-delay-model.h"
21 #include "ns3/spectrum-propagation-loss-model.h"
22 #include "ns3/mobility-model.h"
23 #include "ns3/log.h"
24 #include "ns3/config.h"
25 #include "ns3/simulator.h"
26 #include "ns3/names.h"
27 #include "ns3/antenna-model.h"
28 #include "ns3/spectrum-channel.h"
29 #include "ns3/spectrum-analyzer.h"
30 #include "ns3/non-communicating-net-device.h"
31 #include "ns3/output-stream-wrapper.h"
32 #include "ns3/trace-helper.h"
34 
35 
36 
37 
38 NS_LOG_COMPONENT_DEFINE ("SpectrumAnalyzerHelper");
39 
40 namespace ns3 {
41 
42 
43 static void
45  Ptr<const SpectrumValue> avgPowerSpectralDensity)
46 {
47  NS_LOG_FUNCTION (streamWrapper << avgPowerSpectralDensity);
48  std::ostream* ostream = streamWrapper->GetStream ();
49  if (ostream->good ())
50  {
51  Bands::const_iterator fi = avgPowerSpectralDensity->ConstBandsBegin ();
52  Values::const_iterator vi = avgPowerSpectralDensity->ConstValuesBegin ();
53  while (fi != avgPowerSpectralDensity->ConstBandsEnd ())
54  {
55  NS_ASSERT (vi != avgPowerSpectralDensity->ConstValuesEnd ());
56  *ostream << Now ().GetSeconds () << " "
57  << fi->fc << " "
58  << *vi << std::endl;
59  ++fi;
60  ++vi;
61  }
62  // An additional line separates different spectrums sweeps
63  *ostream << std::endl;
64  }
65 }
66 
67 
68 
70 {
71  NS_LOG_FUNCTION (this);
72  m_phy.SetTypeId ("ns3::SpectrumAnalyzer");
73  m_device.SetTypeId ("ns3::NonCommunicatingNetDevice");
74  m_antenna.SetTypeId ("ns3::IsotropicAntennaModel");
75 }
76 
78 {
79  NS_LOG_FUNCTION (this);
80 }
81 
82 void
84 {
85  NS_LOG_FUNCTION (this);
86  m_channel = channel;
87 }
88 
89 void
90 SpectrumAnalyzerHelper::SetChannel (std::string channelName)
91 {
92  NS_LOG_FUNCTION (this);
93  Ptr<SpectrumChannel> channel = Names::Find<SpectrumChannel> (channelName);
94  m_channel = channel;
95 }
96 
97 
98 void
100 {
101  NS_LOG_FUNCTION (this);
102  m_phy.Set (name, v);
103 }
104 
105 
106 void
108 {
109  NS_LOG_FUNCTION (this);
110  m_device.Set (name, v);
111 }
112 
113 void
115  std::string n0, const AttributeValue &v0,
116  std::string n1, const AttributeValue &v1,
117  std::string n2, const AttributeValue &v2,
118  std::string n3, const AttributeValue &v3,
119  std::string n4, const AttributeValue &v4,
120  std::string n5, const AttributeValue &v5,
121  std::string n6, const AttributeValue &v6,
122  std::string n7, const AttributeValue &v7)
123 {
124  ObjectFactory factory;
125  factory.SetTypeId (type);
126  factory.Set (n0, v0);
127  factory.Set (n1, v1);
128  factory.Set (n2, v2);
129  factory.Set (n3, v3);
130  factory.Set (n4, v4);
131  factory.Set (n5, v5);
132  factory.Set (n6, v6);
133  factory.Set (n7, v7);
134  m_antenna = factory;
135 }
136 
137 
138 void
140 {
141  NS_LOG_FUNCTION (this);
142  m_rxSpectrumModel = m;
143 }
144 
145 void
147 {
148  NS_LOG_FUNCTION (this);
149  m_prefix = prefix;
150 }
151 
152 
153 
156 {
157  NS_LOG_FUNCTION (this);
159  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
160  {
161  Ptr<Node> node = *i;
162 
164 
166  NS_ASSERT (phy);
167 
168  dev->SetPhy (phy);
169 
170  NS_ASSERT (node);
171  phy->SetMobility (node->GetObject<MobilityModel> ());
172 
173  NS_ASSERT (dev);
174  phy->SetDevice (dev);
175 
176  NS_ASSERT_MSG (m_rxSpectrumModel, "you forgot to call SpectrumAnalyzerHelper::SetRxSpectrumModel ()");
177  phy->SetRxSpectrumModel (m_rxSpectrumModel);
178 
179  NS_ASSERT_MSG (m_channel, "you forgot to call SpectrumAnalyzerHelper::SetChannel ()");
180  m_channel->AddRx (phy);
181 
182  dev->SetChannel (m_channel);
183 
184  Ptr<AntennaModel> antenna = (m_antenna.Create ())->GetObject<AntennaModel> ();
185  NS_ASSERT_MSG (antenna, "error in creating the AntennaModel object");
186  phy->SetAntenna (antenna);
187 
188  uint32_t devId = node->AddDevice (dev);
189  devices.Add (dev);
190 
191  if (!m_prefix.empty ())
192  {
193  NS_LOG_LOGIC ("creating new output stream and binding it to the callback");
194  AsciiTraceHelper asciiTraceHelper;
195  std::string filename;
196  filename = asciiTraceHelper.GetFilenameFromDevice (m_prefix, dev);
197  Ptr<OutputStreamWrapper> stream = asciiTraceHelper.CreateFileStream (filename);
198 
199  // note that we don't use AsciiTraceHelper to connect the trace sink, since we use a custom trace sink
200 
201  // the following is inspired from YansWifiPhyHelper::EnableAsciiInternal
202  std::ostringstream oss;
203  oss.str ("");
204  oss << "/NodeList/" << node->GetId () << "/DeviceList/" << devId << "/$ns3::NonCommunicatingNetDevice/Phy/AveragePowerSpectralDensityReport";
206 
207  phy->Start ();
208 
209  }
210  }
211  return devices;
212 }
213 
216 {
217  NS_LOG_FUNCTION (this);
218  return Install (NodeContainer (node));
219 }
220 
222 SpectrumAnalyzerHelper::Install (std::string nodeName) const
223 {
224  NS_LOG_FUNCTION (this);
225  Ptr<Node> node = Names::Find<Node> (nodeName);
226  return Install (node);
227 }
228 
229 
230 } // namespace ns3
Values::const_iterator ConstValuesEnd() const
NS_LOG_COMPONENT_DEFINE("SpectrumAnalyzerHelper")
Manage ASCII trace files for device models.
Definition: trace-helper.h:128
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:345
tuple devices
Definition: first.py:32
void SetAntenna(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
std::vector< Ptr< Node > >::const_iterator Iterator
NetDeviceContainer Install(NodeContainer c) const
Hold a value for an Attribute.
Definition: attribute.h:56
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Build bound Callbacks which take varying numbers of arguments, and potentially returning a value...
Definition: callback.h:1463
#define NS_ASSERT(condition)
Definition: assert.h:64
void SetTypeId(TypeId tid)
void SetDeviceAttribute(std::string n1, const AttributeValue &v1)
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits. ...
This class implements a device which does not communicate, in the sense that it does not interact wit...
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the ascii trace helper figure out a reasonable filename to use for an ascii trace file associated...
Keep track of the current position and velocity of an object.
double GetSeconds(void) const
Definition: nstime.h:274
Bands::const_iterator ConstBandsEnd() const
Ptr< Object > Create(void) const
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
static void WriteAveragePowerSpectralDensityReport(Ptr< OutputStreamWrapper > streamWrapper, Ptr< const SpectrumValue > avgPowerSpectralDensity)
holds a vector of ns3::NetDevice pointers
#define NS_LOG_LOGIC(msg)
Definition: log.h:368
void SetPhyAttribute(std::string name, const AttributeValue &v)
Bands::const_iterator ConstBandsBegin() const
keep track of a set of node pointers.
Simple SpectrumPhy implemetation that averages the spectrum power density of incoming transmissions t...
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
void Set(std::string name, const AttributeValue &value)
#define NS_ASSERT_MSG(condition, message)
Definition: assert.h:86
instantiate subclasses of ns3::Object.
uint32_t AddDevice(Ptr< NetDevice > device)
Definition: node.cc:118
uint32_t GetId(void) const
Definition: node.cc:104
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
void SetChannel(Ptr< SpectrumChannel > channel)
set the SpectrumChannel that will be used by SpectrumPhy instances created by this helper ...
void SetRxSpectrumModel(Ptr< SpectrumModel > m)
Set the spectrum model used by the created SpectrumAnalyzer instances to represent incoming signals...
void EnableAsciiAll(std::string prefix)
Enable ASCII output.
Values::const_iterator ConstValuesBegin() const
Ptr< T > GetObject(void) const
Definition: object.h:361
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:717
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.