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
Values::const_iterator ConstValuesEnd() const
tuple channel
Definition: third.py:85
Manage ASCII trace files for device models.
Definition: trace-helper.h:161
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
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
Node container iterator.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:459
NetDeviceContainer Install(NodeContainer c) const
Hold a value for an Attribute.
Definition: attribute.h:68
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1686
#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_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
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...
ObjectFactory m_device
Object factory for the NetDevice objects.
Keep track of the current position and velocity of an object.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
tuple phy
Definition: third.py:86
Bands::const_iterator ConstBandsEnd() const
Ptr< SpectrumModel > m_rxSpectrumModel
Spectrum model.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
ObjectFactory m_phy
Object factory for the phy objects.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
std::string m_prefix
Prefix for the output files.
holds a vector of ns3::NetDevice pointers
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:832
void SetPhyAttribute(std::string name, const AttributeValue &v)
Bands::const_iterator ConstBandsBegin() const
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Simple SpectrumPhy implementation that averages the spectrum power density of incoming transmissions ...
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
Ptr< SpectrumChannel > m_channel
Channel.
void Set(std::string name, const AttributeValue &value)
Set an attribute to be set during construction.
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
ObjectFactory m_antenna
Object factory for the Antenna objects.
#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:90
Instantiate subclasses of ns3::Object.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:128
uint32_t GetId(void) const
Definition: node.cc:107
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.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:365
Values::const_iterator ConstValuesBegin() const
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
static void WriteAveragePowerSpectralDensityReport(Ptr< OutputStreamWrapper > streamWrapper, Ptr< const SpectrumValue > avgPowerSpectralDensity)
Writes a report of the Average Power Spectral Density.