satellite-interference.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013 Magister Solutions Ltd.
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: Sami Rantanen <sami.rantanen@magister.fi>
19  */
20 
21 #include "satellite-interference.h"
22 
23 #include <ns3/log.h>
24 #include <ns3/simulator.h>
25 
26 NS_LOG_COMPONENT_DEFINE("SatInterference");
27 
28 namespace ns3
29 {
30 
32  Time rxDuration,
33  double rxPower,
34  Address satEarthStationAddress)
35  : m_startTime(Simulator::Now()),
36  m_endTime(m_startTime + rxDuration),
37  m_rxPower(rxPower),
38  m_id(id),
39  m_satEarthStationAddress(satEarthStationAddress)
40 {
41 }
42 
44 {
45 }
46 
47 uint32_t
49 {
50  NS_LOG_FUNCTION(this);
51 
52  return m_id;
53 }
54 
55 Time
57 {
58  NS_LOG_FUNCTION(this);
59 
60  return m_endTime - m_startTime;
61 }
62 
63 Time
65 {
66  NS_LOG_FUNCTION(this);
67 
68  return m_startTime;
69 }
70 
71 Time
73 {
74  NS_LOG_FUNCTION(this);
75 
76  return m_endTime;
77 }
78 
79 double
81 {
82  NS_LOG_FUNCTION(this);
83 
84  return m_rxPower;
85 }
86 
87 Address
89 {
90  NS_LOG_FUNCTION(this);
91 
92  return m_satEarthStationAddress;
93 }
94 
95 /****************************************************************
96  * The actual SatInterference
97  ****************************************************************/
98 
99 NS_OBJECT_ENSURE_REGISTERED(SatInterference);
100 
101 TypeId
103 {
104  static TypeId tid = TypeId("ns3::SatInterference").SetParent<Object>();
105 
106  return tid;
107 }
108 
109 TypeId
111 {
112  return GetTypeId();
113 }
114 
117 {
118 }
119 
121 {
122 }
123 
124 Ptr<SatInterference::InterferenceChangeEvent>
125 SatInterference::Add(Time duration, double power, Address rxAddress)
126 {
127  NS_LOG_FUNCTION(this << duration.GetSeconds() << power << rxAddress);
128 
129  return DoAdd(duration, power, rxAddress);
130 }
131 
132 std::vector<std::pair<double, double>>
133 SatInterference::Calculate(Ptr<SatInterference::InterferenceChangeEvent> event)
134 {
135  NS_LOG_FUNCTION(this);
136 
137  if (m_currentlyReceiving > 1)
138  {
139  std::map<Ptr<SatInterference::InterferenceChangeEvent>, bool>::iterator iter;
140  bool wasCollisionReported = true;
141 
142  for (iter = m_packetCollisions.begin(); iter != m_packetCollisions.end(); iter++)
143  {
144  if (!iter->second)
145  {
146  wasCollisionReported = false;
147  }
148  iter->second = true;
149  }
150  if (!wasCollisionReported)
151  {
152  NS_LOG_INFO("Packet collision!");
153  }
154  }
155 
156  return DoCalculate(event);
157 }
158 
159 void
161 {
162  NS_LOG_FUNCTION(this);
163 
164  m_packetCollisions.clear();
166 
167  DoReset();
168 }
169 
170 void
171 SatInterference::NotifyRxStart(Ptr<SatInterference::InterferenceChangeEvent> event)
172 {
173  NS_LOG_FUNCTION(this);
174 
176 
177  std::pair<std::map<Ptr<SatInterference::InterferenceChangeEvent>, bool>::iterator, bool> result;
178  result = m_packetCollisions.insert(std::make_pair(event, false));
179 
180  if (!result.second)
181  {
182  NS_FATAL_ERROR("SatInterference::NotifyRxStart - Event already exists");
183  }
184 
185  DoNotifyRxStart(event);
186 }
187 
188 void
189 SatInterference::NotifyRxEnd(Ptr<SatInterference::InterferenceChangeEvent> event)
190 {
191  NS_LOG_FUNCTION(this);
192 
193  if (m_currentlyReceiving > 0)
194  {
196  }
197 
198  m_packetCollisions.erase(event);
199 
200  DoNotifyRxEnd(event);
201 }
202 
203 bool
204 SatInterference::HasCollision(Ptr<SatInterference::InterferenceChangeEvent> event)
205 {
206  NS_LOG_FUNCTION(this);
207 
208  std::map<Ptr<SatInterference::InterferenceChangeEvent>, bool>::iterator result =
209  m_packetCollisions.find(event);
210 
211  if (result == m_packetCollisions.end())
212  {
213  NS_FATAL_ERROR("SatInterference::HasCollision - Event not found");
214  }
215 
216  return result->second;
217 }
218 
219 } // namespace ns3
220 
221 // namespace ns3
~InterferenceChangeEvent()
Destructor of Event for satellite interference.
InterferenceChangeEvent(uint32_t id, Time duration, double rxPower, Address satEarthStationAddress)
Constructor of Event for satellite interference.
Abstract class defining interface for interference calculations objects.
TypeId GetInstanceTypeId(void) const
Derived from Object.
virtual void DoNotifyRxStart(Ptr< SatInterference::InterferenceChangeEvent > event)=0
Notifies that RX is started by a receiver.
void Reset(void)
Resets current interference.
virtual std::vector< std::pair< double, double > > DoCalculate(Ptr< SatInterference::InterferenceChangeEvent > event)=0
Calculates interference power for the given reference Sets final power at end time to finalPower.
Ptr< SatInterference::InterferenceChangeEvent > Add(Time rxDuration, double rxPower, Address rxAddress)
Adds interference power to interference object.
~SatInterference()
Destructor for Satellite interference base class.
virtual Ptr< SatInterference::InterferenceChangeEvent > DoAdd(Time rxDuration, double rxPower, Address rxAddress)=0
Adds interference power to interference object.
static TypeId GetTypeId(void)
Derived from Object.
virtual void DoNotifyRxEnd(Ptr< SatInterference::InterferenceChangeEvent > event)=0
Notifies that RX is ended by a receiver.
virtual void NotifyRxEnd(Ptr< SatInterference::InterferenceChangeEvent > event)
Notifies that RX is ended by a receiver.
virtual void DoReset(void)=0
Resets current interference.
virtual void NotifyRxStart(Ptr< SatInterference::InterferenceChangeEvent > event)
Notifies that RX is started by a receiver.
virtual bool HasCollision(Ptr< SatInterference::InterferenceChangeEvent > event)
Checks whether the packet has collided.
std::vector< std::pair< double, double > > Calculate(Ptr< SatInterference::InterferenceChangeEvent > event)
Calculates interference power for the given reference.
SatInterference()
Constructor for Satellite interference base class.
std::map< Ptr< SatInterference::InterferenceChangeEvent >, bool > m_packetCollisions
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.