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
38namespace ns3 {
39
40NS_LOG_COMPONENT_DEFINE ("SpectrumAnalyzerHelper");
41
48static 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
87void
89{
90 NS_LOG_FUNCTION (this);
92}
93
94void
95SpectrumAnalyzerHelper::SetChannel (std::string channelName)
96{
97 NS_LOG_FUNCTION (this);
98 Ptr<SpectrumChannel> channel = Names::Find<SpectrumChannel> (channelName);
100}
101
102
103void
105{
106 NS_LOG_FUNCTION (this);
107 m_phy.Set (name, v);
108}
109
110
111void
113{
114 NS_LOG_FUNCTION (this);
115 m_device.Set (name, v);
116}
117
118void
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
143void
145{
146 NS_LOG_FUNCTION (this);
148}
149
150void
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
227SpectrumAnalyzerHelper::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.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
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.
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