A Discrete-Event Network Simulator
API
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 namespace ns3 {
39 
40 NS_LOG_COMPONENT_DEFINE ("SpectrumAnalyzerHelper");
41 
48 static void
50  Ptr<const SpectrumValue> avgPowerSpectralDensity)
51 {
52  NS_LOG_FUNCTION (streamWrapper << avgPowerSpectralDensity);
53  std::ostream* ostream = streamWrapper->GetStream ();
54  if (ostream->good ())
55  {
56  Bands::const_iterator fi = avgPowerSpectralDensity->ConstBandsBegin ();
57  Values::const_iterator vi = avgPowerSpectralDensity->ConstValuesBegin ();
58  while (fi != avgPowerSpectralDensity->ConstBandsEnd ())
59  {
60  NS_ASSERT (vi != avgPowerSpectralDensity->ConstValuesEnd ());
61  *ostream << Now ().GetSeconds () << " "
62  << fi->fc << " "
63  << *vi << std::endl;
64  ++fi;
65  ++vi;
66  }
67  // An additional line separates different spectrums sweeps
68  *ostream << std::endl;
69  }
70 }
71 
72 
73 
75 {
76  NS_LOG_FUNCTION (this);
77  m_phy.SetTypeId ("ns3::SpectrumAnalyzer");
78  m_device.SetTypeId ("ns3::NonCommunicatingNetDevice");
79  m_antenna.SetTypeId ("ns3::IsotropicAntennaModel");
80 }
81 
83 {
84  NS_LOG_FUNCTION (this);
85 }
86 
87 void
89 {
90  NS_LOG_FUNCTION (this);
92 }
93 
94 void
95 SpectrumAnalyzerHelper::SetChannel (std::string channelName)
96 {
97  NS_LOG_FUNCTION (this);
98  Ptr<SpectrumChannel> channel = Names::Find<SpectrumChannel> (channelName);
100 }
101 
102 
103 void
105 {
106  NS_LOG_FUNCTION (this);
107  m_phy.Set (name, v);
108 }
109 
110 
111 void
113 {
114  NS_LOG_FUNCTION (this);
115  m_device.Set (name, v);
116 }
117 
118 void
120  std::string n0, const AttributeValue &v0,
121  std::string n1, const AttributeValue &v1,
122  std::string n2, const AttributeValue &v2,
123  std::string n3, const AttributeValue &v3,
124  std::string n4, const AttributeValue &v4,
125  std::string n5, const AttributeValue &v5,
126  std::string n6, const AttributeValue &v6,
127  std::string n7, const AttributeValue &v7)
128 {
129  ObjectFactory factory;
130  factory.SetTypeId (type);
131  factory.Set (n0, v0);
132  factory.Set (n1, v1);
133  factory.Set (n2, v2);
134  factory.Set (n3, v3);
135  factory.Set (n4, v4);
136  factory.Set (n5, v5);
137  factory.Set (n6, v6);
138  factory.Set (n7, v7);
139  m_antenna = factory;
140 }
141 
142 
143 void
145 {
146  NS_LOG_FUNCTION (this);
147  m_rxSpectrumModel = m;
148 }
149 
150 void
152 {
153  NS_LOG_FUNCTION (this);
154  m_prefix = prefix;
155 }
156 
157 
158 
161 {
162  NS_LOG_FUNCTION (this);
164  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
165  {
166  Ptr<Node> node = *i;
167 
169 
171  NS_ASSERT (phy);
172 
173  dev->SetPhy (phy);
174 
175  NS_ASSERT (node);
176  phy->SetMobility (node->GetObject<MobilityModel> ());
177 
178  NS_ASSERT (dev);
179  phy->SetDevice (dev);
180 
181  NS_ASSERT_MSG (m_rxSpectrumModel, "you forgot to call SpectrumAnalyzerHelper::SetRxSpectrumModel ()");
182  phy->SetRxSpectrumModel (m_rxSpectrumModel);
183 
184  NS_ASSERT_MSG (m_channel, "you forgot to call SpectrumAnalyzerHelper::SetChannel ()");
185  m_channel->AddRx (phy);
186 
187  dev->SetChannel (m_channel);
188 
189  Ptr<AntennaModel> antenna = (m_antenna.Create ())->GetObject<AntennaModel> ();
190  NS_ASSERT_MSG (antenna, "error in creating the AntennaModel object");
191  phy->SetAntenna (antenna);
192 
193  uint32_t devId = node->AddDevice (dev);
194  devices.Add (dev);
195 
196  if (!m_prefix.empty ())
197  {
198  NS_LOG_LOGIC ("creating new output stream and binding it to the callback");
199  AsciiTraceHelper asciiTraceHelper;
200  std::string filename;
201  filename = asciiTraceHelper.GetFilenameFromDevice (m_prefix, dev);
202  Ptr<OutputStreamWrapper> stream = asciiTraceHelper.CreateFileStream (filename);
203 
204  // note that we don't use AsciiTraceHelper to connect the trace sink, since we use a custom trace sink
205 
206  // the following is inspired from YansWifiPhyHelper::EnableAsciiInternal
207  std::ostringstream oss;
208  oss.str ("");
209  oss << "/NodeList/" << node->GetId () << "/DeviceList/" << devId << "/$ns3::NonCommunicatingNetDevice/Phy/AveragePowerSpectralDensityReport";
211 
212  phy->Start ();
213 
214  }
215  }
216  return devices;
217 }
218 
221 {
222  NS_LOG_FUNCTION (this);
223  return Install (NodeContainer (node));
224 }
225 
227 SpectrumAnalyzerHelper::Install (std::string nodeName) const
228 {
229  NS_LOG_FUNCTION (this);
230  Ptr<Node> node = Names::Find<Node> (nodeName);
231  return Install (node);
232 }
233 
234 
235 } // namespace ns3
Manage ASCII trace files for device models.
Definition: trace-helper.h:163
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...
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.
Hold a value for an Attribute.
Definition: attribute.h:69
Keep track of the current position and velocity of an object.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
uint32_t GetId(void) const
Definition: node.cc:109
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
This class implements a device which does not communicate, in the sense that it does not interact wit...
Instantiate subclasses of ns3::Object.
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
ObjectFactory m_phy
Object factory for the phy objects.
NetDeviceContainer Install(NodeContainer c) const
Ptr< SpectrumModel > m_rxSpectrumModel
Spectrum model.
void SetPhyAttribute(std::string name, const AttributeValue &v)
void SetDeviceAttribute(std::string n1, const AttributeValue &v1)
void SetChannel(Ptr< SpectrumChannel > channel)
Set the SpectrumChannel that will be used by SpectrumPhy instances created by this helper.
ObjectFactory m_antenna
Object factory for the Antenna objects.
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::string m_prefix
Prefix for the output files.
void EnableAsciiAll(std::string prefix)
Enable ASCII output.
Ptr< SpectrumChannel > m_channel
Channel.
ObjectFactory m_device
Object factory for the NetDevice objects.
void SetRxSpectrumModel(Ptr< SpectrumModel > m)
Set the spectrum model used by the created SpectrumAnalyzer instances to represent incoming signals.
Simple SpectrumPhy implementation that averages the spectrum power density of incoming transmissions ...
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:901
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1709
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
static void WriteAveragePowerSpectralDensityReport(Ptr< OutputStreamWrapper > streamWrapper, Ptr< const SpectrumValue > avgPowerSpectralDensity)
Writes a report of the Average Power Spectral Density.
devices
Definition: first.py:39
Every class exported by the ns3 library is enclosed in the ns3 namespace.
channel
Definition: third.py:92
phy
Definition: third.py:93