Loading...
Searching...
No Matches
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
22
23#include "ns3/log.h"
24#include "ns3/simulator.h"
25
26#include <map>
27#include <utility>
28#include <vector>
29
30NS_LOG_COMPONENT_DEFINE("SatInterference");
31
32namespace ns3
33{
34
36 Time rxDuration,
37 double rxPower,
38 Address satEarthStationAddress)
39 : m_startTime(Simulator::Now()),
40 m_endTime(m_startTime + rxDuration),
41 m_rxPower(rxPower),
42 m_id(id),
43 m_satEarthStationAddress(satEarthStationAddress)
44{
45}
46
50
51uint32_t
53{
54 NS_LOG_FUNCTION(this);
55
56 return m_id;
57}
58
59Time
61{
62 NS_LOG_FUNCTION(this);
63
64 return m_endTime - m_startTime;
65}
66
67Time
69{
70 NS_LOG_FUNCTION(this);
71
72 return m_startTime;
73}
74
75Time
77{
78 NS_LOG_FUNCTION(this);
79
80 return m_endTime;
81}
82
83double
85{
86 NS_LOG_FUNCTION(this);
87
88 return m_rxPower;
89}
90
91Address
98
99/****************************************************************
100 * The actual SatInterference
101 ****************************************************************/
102
103NS_OBJECT_ENSURE_REGISTERED(SatInterference);
104
105TypeId
107{
108 static TypeId tid = TypeId("ns3::SatInterference").SetParent<Object>();
109
110 return tid;
111}
112
117
121
122Ptr<SatInterference::InterferenceChangeEvent>
123SatInterference::Add(Time duration, double power, Address rxAddress)
124{
125 NS_LOG_FUNCTION(this << duration.GetSeconds() << power << rxAddress);
126
127 return DoAdd(duration, power, rxAddress);
128}
129
130std::vector<std::pair<double, double>>
131SatInterference::Calculate(Ptr<SatInterference::InterferenceChangeEvent> event)
132{
133 NS_LOG_FUNCTION(this);
134
135 if (m_currentlyReceiving > 1)
136 {
137 std::map<Ptr<SatInterference::InterferenceChangeEvent>, bool>::iterator iter;
138 bool wasCollisionReported = true;
139
140 for (iter = m_packetCollisions.begin(); iter != m_packetCollisions.end(); iter++)
141 {
142 if (!iter->second)
143 {
144 wasCollisionReported = false;
145 }
146 iter->second = true;
147 }
148 if (!wasCollisionReported)
149 {
150 NS_LOG_INFO("Packet collision!");
151 }
152 }
153
154 return DoCalculate(event);
155}
156
157void
159{
160 NS_LOG_FUNCTION(this);
161
162 m_packetCollisions.clear();
164
165 DoReset();
166}
167
168void
169SatInterference::NotifyRxStart(Ptr<SatInterference::InterferenceChangeEvent> event)
170{
171 NS_LOG_FUNCTION(this);
172
174
175 std::pair<std::map<Ptr<SatInterference::InterferenceChangeEvent>, bool>::iterator, bool> result;
176 result = m_packetCollisions.insert(std::make_pair(event, false));
177
178 if (!result.second)
179 {
180 NS_FATAL_ERROR("SatInterference::NotifyRxStart - Event already exists");
181 }
182
183 DoNotifyRxStart(event);
184}
185
186void
187SatInterference::NotifyRxEnd(Ptr<SatInterference::InterferenceChangeEvent> event)
188{
189 NS_LOG_FUNCTION(this);
190
191 if (m_currentlyReceiving > 0)
192 {
194 }
195
196 m_packetCollisions.erase(event);
197
198 DoNotifyRxEnd(event);
199}
200
201bool
202SatInterference::HasCollision(Ptr<SatInterference::InterferenceChangeEvent> event)
203{
204 NS_LOG_FUNCTION(this);
205
206 std::map<Ptr<SatInterference::InterferenceChangeEvent>, bool>::iterator result =
207 m_packetCollisions.find(event);
208
209 if (result == m_packetCollisions.end())
210 {
211 NS_FATAL_ERROR("SatInterference::HasCollision - Event not found");
212 }
213
214 return result->second;
215}
216
217} // namespace ns3
218
219// 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.
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.
virtual void DoNotifyRxStart(Ptr< SatInterference::InterferenceChangeEvent > event)=0
Notifies that RX is started by a receiver.
void Reset(void)
Resets current interference.
Ptr< SatInterference::InterferenceChangeEvent > Add(Time rxDuration, double rxPower, Address rxAddress)
Adds interference power to interference object.
~SatInterference()
Destructor for Satellite interference base class.
static TypeId GetTypeId(void)
Derived from Object.
virtual Ptr< SatInterference::InterferenceChangeEvent > DoAdd(Time rxDuration, double rxPower, Address rxAddress)=0
Adds interference power to interference 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.