A Discrete-Event Network Simulator
API
uan-channel.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2009 University of Washington
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: Leonard Tracy <lentracy@gmail.com>
19 */
20
21#include "ns3/object.h"
22#include "ns3/packet.h"
23#include "ns3/simulator.h"
24#include "ns3/mobility-model.h"
25#include "ns3/net-device.h"
26#include "ns3/node.h"
27#include "ns3/log.h"
28#include "ns3/pointer.h"
29#include "ns3/string.h"
30#include "uan-channel.h"
31#include "uan-phy.h"
32#include "uan-prop-model.h"
33#include "uan-tx-mode.h"
34#include "uan-net-device.h"
35#include "uan-transducer.h"
38
39namespace ns3 {
40
41NS_LOG_COMPONENT_DEFINE ("UanChannel");
42
44
45TypeId
47{
48 static TypeId tid = TypeId ("ns3::UanChannel")
50 .SetGroupName ("Uan")
51 .AddConstructor<UanChannel> ()
52 .AddAttribute ("PropagationModel",
53 "A pointer to the propagation model.",
54 StringValue ("ns3::UanPropModelIdeal"),
56 MakePointerChecker<UanPropModel> ())
57 .AddAttribute ("NoiseModel",
58 "A pointer to the model of the channel ambient noise.",
59 StringValue ("ns3::UanNoiseModelDefault"),
61 MakePointerChecker<UanNoiseModel> ())
62 ;
63
64 return tid;
65}
66
68 : Channel (),
69 m_prop (0),
70 m_cleared (false)
71{
72}
73
75{
76}
77
78void
80{
81 if (m_cleared)
82 {
83 return;
84 }
85 m_cleared = true;
86 UanDeviceList::iterator it = m_devList.begin ();
87 for (; it != m_devList.end (); it++)
88 {
89 if (it->first)
90 {
91 it->first->Clear ();
92 it->first = 0;
93 }
94 if (it->second)
95 {
96 it->second->Clear ();
97 it->second = 0;
98 }
99 }
100 m_devList.clear ();
101 if (m_prop)
102 {
103 m_prop->Clear ();
104 m_prop = 0;
105 }
106 if (m_noise)
107 {
108 m_noise->Clear ();
109 m_noise = 0;
110 }
111
112}
113
114void
116{
117 Clear ();
119}
120void
122{
123 NS_LOG_DEBUG ("Set Prop Model " << this);
124 m_prop = prop;
125}
126
127std::size_t
129{
130 return m_devList.size ();
131}
132
134UanChannel::GetDevice (std::size_t i) const
135{
136 return m_devList[i].first;
137}
138
139void
141{
142 NS_LOG_DEBUG ("Adding dev/trans pair number " << m_devList.size ());
143 m_devList.push_back (std::make_pair (dev, trans));
144}
145
146void
148 double txPowerDb, UanTxMode txMode)
149{
150 Ptr<MobilityModel> senderMobility = 0;
151
152 NS_LOG_DEBUG ("Channel scheduling");
153 for (UanDeviceList::const_iterator i = m_devList.begin (); i
154 != m_devList.end (); i++)
155 {
156
157 if (src == i->second)
158 {
159 senderMobility = i->first->GetNode ()->GetObject<MobilityModel> ();
160 break;
161 }
162 }
163 NS_ASSERT (senderMobility != 0);
164 uint32_t j = 0;
165 UanDeviceList::const_iterator i = m_devList.begin ();
166 for (; i != m_devList.end (); i++)
167 {
168 if (src != i->second)
169 {
170 NS_LOG_DEBUG ("Scheduling " << i->first->GetMac ()->GetAddress ());
171 Ptr<MobilityModel> rcvrMobility = i->first->GetNode ()->GetObject<MobilityModel> ();
172 Time delay = m_prop->GetDelay (senderMobility, rcvrMobility, txMode);
173 UanPdp pdp = m_prop->GetPdp (senderMobility, rcvrMobility, txMode);
174 double rxPowerDb = txPowerDb - m_prop->GetPathLossDb (senderMobility,
175 rcvrMobility,
176 txMode);
177
178 NS_LOG_DEBUG ("txPowerDb=" << txPowerDb << "dB, rxPowerDb="
179 << rxPowerDb << "dB, distance="
180 << senderMobility->GetDistanceFrom (rcvrMobility)
181 << "m, delay=" << delay);
182
183 uint32_t dstNodeId = i->first->GetNode ()->GetId ();
184 Ptr<Packet> copy = packet->Copy ();
185 Simulator::ScheduleWithContext (dstNodeId, delay,
187 this,
188 j,
189 copy,
190 rxPowerDb,
191 txMode,
192 pdp);
193 }
194 j++;
195 }
196}
197
198void
200{
201 NS_ASSERT (noise);
202 m_noise = noise;
203}
204void
205UanChannel::SendUp (uint32_t i, Ptr<Packet> packet, double rxPowerDb,
206 UanTxMode txMode, UanPdp pdp)
207{
208 NS_LOG_DEBUG ("Channel: In sendup");
209 m_devList[i].second->Receive (packet, rxPowerDb, txMode, pdp);
210}
211
212double
214{
216 double noise = m_noise->GetNoiseDbHz (fKhz);
217 return noise;
218}
219
220} // namespace ns3
Abstract Channel Base Class.
Definition: channel.h:44
Keep track of the current position and velocity of an object.
double GetDistanceFrom(Ptr< const MobilityModel > position) const
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
static void ScheduleWithContext(uint32_t context, Time const &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition: simulator.h:571
Hold variables of type string.
Definition: string.h:41
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Channel class used by UAN devices.
Definition: uan-channel.h:46
void SetNoiseModel(Ptr< UanNoiseModel > noise)
Set the noise model this channel will use to determine ambient channel noise.
Definition: uan-channel.cc:199
double GetNoiseDbHz(double fKhz)
Get the noise level on the channel.
Definition: uan-channel.cc:213
virtual std::size_t GetNDevices(void) const
Definition: uan-channel.cc:128
void AddDevice(Ptr< UanNetDevice > dev, Ptr< UanTransducer > trans)
Adds device to receiver list for this channel.
Definition: uan-channel.cc:140
UanChannel()
Constructor.
Definition: uan-channel.cc:67
Ptr< UanPropModel > m_prop
The propagation model.
Definition: uan-channel.h:116
virtual ~UanChannel()
Dummy destructor, see DoDispose.
Definition: uan-channel.cc:74
Ptr< UanNoiseModel > m_noise
The noise model.
Definition: uan-channel.h:117
void Clear(void)
Clear all pointer references.
Definition: uan-channel.cc:79
virtual void DoDispose(void)
Destructor implementation.
Definition: uan-channel.cc:115
static TypeId GetTypeId(void)
Register this type.
Definition: uan-channel.cc:46
virtual void TxPacket(Ptr< UanTransducer > src, Ptr< Packet > packet, double txPowerDb, UanTxMode txmode)
Send a packet out on the channel.
Definition: uan-channel.cc:147
bool m_cleared
Has Clear ever been called on the channel.
Definition: uan-channel.h:119
UanDeviceList m_devList
The list of devices on this channel.
Definition: uan-channel.h:115
void SendUp(uint32_t i, Ptr< Packet > packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
Send a packet up to the receiving UanTransducer.
Definition: uan-channel.cc:205
virtual Ptr< NetDevice > GetDevice(std::size_t i) const
Definition: uan-channel.cc:134
void SetPropagationModel(Ptr< UanPropModel > prop)
Set the propagation model this channel will use for path loss/propagation delay.
Definition: uan-channel.cc:121
The power delay profile returned by propagation models.
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:42
#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
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:227
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.