View | Details | Raw Unified | Return to bug 2947
Collapse All | Expand All

(-)a/src/wifi/model/interference-helper.cc (-127 / +75 lines)
 Lines 25-30    Link Here 
25
#include "ns3/log.h"
25
#include "ns3/log.h"
26
#include <algorithm>
26
#include <algorithm>
27
27
28
using TimeInterval = boost::icl::interval<ns3::Time>;
29
28
namespace ns3 {
30
namespace ns3 {
29
31
30
NS_LOG_COMPONENT_DEFINE ("InterferenceHelper");
32
NS_LOG_COMPONENT_DEFINE ("InterferenceHelper");
 Lines 84-130    Link Here 
84
86
85
87
86
/****************************************************************
88
/****************************************************************
87
 *       Class which records SNIR change events for a
88
 *       short period of time.
89
 ****************************************************************/
90
91
InterferenceHelper::NiChange::NiChange (double power, Ptr<InterferenceHelper::Event> event)
92
  : m_power (power),
93
    m_event (event)
94
{
95
}
96
97
double
98
InterferenceHelper::NiChange::GetPower (void) const
99
{
100
  return m_power;
101
}
102
103
void
104
InterferenceHelper::NiChange::AddPower (double power)
105
{
106
  m_power += power;
107
}
108
109
Ptr<InterferenceHelper::Event>
110
InterferenceHelper::NiChange::GetEvent (void) const
111
{
112
  return m_event;
113
}
114
115
116
/****************************************************************
117
 *       The actual InterferenceHelper
89
 *       The actual InterferenceHelper
118
 ****************************************************************/
90
 ****************************************************************/
119
91
120
InterferenceHelper::InterferenceHelper ()
92
InterferenceHelper::InterferenceHelper ()
121
  : m_errorRateModel (0),
93
  : m_errorRateModel (0),
122
    m_numRxAntennas (1),
94
    m_numRxAntennas (1),
123
    m_firstPower (0),
124
    m_rxing (false)
95
    m_rxing (false)
125
{
96
{
126
  // Always have a zero power noise event in the list
127
  AddNiChangeEvent (Time (0), NiChange (0.0, 0));
128
}
97
}
129
98
130
InterferenceHelper::~InterferenceHelper ()
99
InterferenceHelper::~InterferenceHelper ()
 Lines 184-226    Link Here 
184
Time
153
Time
185
InterferenceHelper::GetEnergyDuration (double energyW) const
154
InterferenceHelper::GetEnergyDuration (double energyW) const
186
{
155
{
187
  Time now = Simulator::Now ();
156
  const Time now = Simulator::Now ();
188
  auto i = GetPreviousPosition (now);
157
189
  Time end = i->first;
158
  Time last = Time::Min();
190
  for (; i != m_niChanges.end (); ++i)
159
160
  for (auto i = m_niChanges.find(now), end = m_niChanges.end (); i != end; ++i)
191
    {
161
    {
192
      double noiseInterferenceW = i->second.GetPower ();
162
      double noiseInterferenceW = i->second;
193
      end = i->first;
163
      last = i->first.upper();
194
      if (noiseInterferenceW < energyW)
164
      if (noiseInterferenceW < energyW)
195
        {
165
        {
196
          break;
166
          break;
197
        }
167
        }
198
    }
168
    }
199
  return end > now ? end - now : MicroSeconds (0);
169
  return last > now ? last - now : MicroSeconds (0);
200
}
170
}
201
171
202
void
172
void
203
InterferenceHelper::AppendEvent (Ptr<InterferenceHelper::Event> event)
173
InterferenceHelper::AppendEvent (Ptr<InterferenceHelper::Event> event)
204
{
174
{
205
  NS_LOG_FUNCTION (this);
175
  NS_LOG_FUNCTION (this);
206
  double previousPowerStart = 0;
207
  double previousPowerEnd = 0;
208
  previousPowerStart = GetPreviousPosition (event->GetStartTime ())->second.GetPower ();
209
  previousPowerEnd = GetPreviousPosition (event->GetEndTime ())->second.GetPower ();
210
176
211
  if (!m_rxing)
177
  if (!m_rxing)
212
    {
178
    {
213
      m_firstPower = previousPowerStart;
179
      // Remove all events before this event, do not include the start time
214
      // Always leave the first zero power noise event in the list
180
      m_niChanges -= TimeInterval::right_open(Seconds(0), event->GetStartTime ());
215
      m_niChanges.erase (++(m_niChanges.begin ()),
216
                         GetNextPosition (event->GetStartTime ()));
217
    }
181
    }
218
  auto first = AddNiChangeEvent (event->GetStartTime (), NiChange (previousPowerStart, event));
182
219
  auto last = AddNiChangeEvent (event->GetEndTime (), NiChange (previousPowerEnd, event));
183
  auto inter = TimeInterval::closed(event->GetStartTime (), event->GetEndTime ());
220
  for (auto i = first; i != last; ++i)
184
221
    {
185
  m_niChanges += std::make_pair(inter, event->GetRxPowerW());
222
      i->second.AddPower (event->GetRxPowerW ());
186
223
    }
187
  /*std::cout << inter << " " << event->GetRxPowerW() << std::endl;
188
  //std::cout << m_niChanges.size() << std::endl;
189
  for (auto i = m_niChanges.begin(), end = m_niChanges.end(); i != end; ++i)
190
  {
191
    std::cout << i->first << " " << i->second << std::endl;
192
  }
193
  std::cout << std::endl;*/
224
}
194
}
225
195
226
double
196
double
 Lines 239-248    Link Here 
239
}
209
}
240
210
241
double
211
double
242
InterferenceHelper::CalculateNoiseInterferenceW (Ptr<InterferenceHelper::Event> event, NiChanges *ni) const
212
InterferenceHelper::CalculateNoiseInterferenceW (Ptr<InterferenceHelper::Event> event, NiChangesRange *ni) const
243
{
213
{
244
  double noiseInterference = m_firstPower;
214
  // Get all the powers between this event's start and end time inclusive
245
  auto it = m_niChanges.find (event->GetStartTime ());
215
  *ni = m_niChanges.equal_range(TimeInterval::closed(event->GetStartTime (), event->GetEndTime()));
216
217
  /*auto it = m_niChanges.find (event->GetStartTime ());
246
  for (; it != m_niChanges.end () && it->second.GetEvent () != event; ++it)
218
  for (; it != m_niChanges.end () && it->second.GetEvent () != event; ++it)
247
    {
219
    {
248
      noiseInterference = it->second.GetPower ();
220
      noiseInterference = it->second.GetPower ();
 Lines 252-259    Link Here 
252
    {
224
    {
253
      ni->insert (*it);
225
      ni->insert (*it);
254
    }
226
    }
255
  ni->emplace (event->GetEndTime (), NiChange (0, event));
227
  ni->emplace (event->GetEndTime (), NiChange (0, event));*/
256
  return noiseInterference;
228
229
  // If there are no events, then there is no interference
230
  return ni->first == ni->second ? 0 : ni->first->second - event->GetRxPowerW ();
257
}
231
}
258
232
259
double
233
double
 Lines 279-339    Link Here 
279
}
253
}
280
254
281
double
255
double
282
InterferenceHelper::CalculatePlcpPayloadPer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
256
InterferenceHelper::CalculatePlcpPayloadPer (Ptr<const InterferenceHelper::Event> event, const NiChangesRange& ni) const
283
{
257
{
284
  NS_LOG_FUNCTION (this);
258
  NS_LOG_FUNCTION (this);
285
  const WifiTxVector txVector = event->GetTxVector ();
259
  const WifiTxVector txVector = event->GetTxVector ();
260
  const double powerW = event->GetRxPowerW ();
261
286
  double psr = 1.0; /* Packet Success Rate */
262
  double psr = 1.0; /* Packet Success Rate */
287
  auto j = ni->begin ();
263
  
288
  Time previous = j->first;
289
  WifiMode payloadMode = event->GetPayloadMode ();
264
  WifiMode payloadMode = event->GetPayloadMode ();
290
  WifiPreamble preamble = txVector.GetPreambleType ();
265
  WifiPreamble preamble = txVector.GetPreambleType ();
291
  Time plcpHeaderStart = j->first + WifiPhy::GetPlcpPreambleDuration (txVector); //packet start time + preamble
266
  Time plcpHeaderStart = event->GetStartTime() + WifiPhy::GetPlcpPreambleDuration (txVector); //packet start time + preamble
292
  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (txVector); //packet start time + preamble + L-SIG
267
  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (txVector); //packet start time + preamble + L-SIG
293
  Time plcpTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble) + WifiPhy::GetPlcpSigA1Duration (preamble) + WifiPhy::GetPlcpSigA2Duration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A
268
  Time plcpTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble) + WifiPhy::GetPlcpSigA1Duration (preamble) + WifiPhy::GetPlcpSigA2Duration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A
294
  Time plcpPayloadStart = plcpTrainingSymbolsStart + WifiPhy::GetPlcpTrainingSymbolDuration (txVector) + WifiPhy::GetPlcpSigBDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
269
  Time plcpPayloadStart = plcpTrainingSymbolsStart + WifiPhy::GetPlcpTrainingSymbolDuration (txVector) + WifiPhy::GetPlcpSigBDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
295
  double noiseInterferenceW = m_firstPower;
270
  
296
  double powerW = event->GetRxPowerW ();
271
  for (auto j = ni.first, end = ni.second; j != end; ++j)
297
  while (++j != ni->end ())
298
    {
272
    {
299
      Time current = j->first;
273
      const Time startt = j->first.lower();
300
      NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
274
      const Time endt = j->first.upper();
301
      NS_ASSERT (current >= previous);
275
302
      //Case 1: Both previous and current point to the payload
276
      const double noiseInterferenceW = j->second - powerW;
303
      if (previous >= plcpPayloadStart)
277
278
      NS_LOG_DEBUG ("startt= " << startt << ", endt=" << endt << ", noiseInterferenceW=" << noiseInterferenceW);
279
280
      //Case 1: This interval is after the payload has started
281
      if (startt >= plcpPayloadStart)
304
        {
282
        {
305
          psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
283
          psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
306
                                                          noiseInterferenceW,
284
                                                          noiseInterferenceW,
307
                                                          txVector.GetChannelWidth ()),
285
                                                          txVector.GetChannelWidth ()),
308
                                            current - previous,
286
                                            endt - startt,
309
                                            payloadMode, txVector);
287
                                            payloadMode, txVector);
310
          NS_LOG_DEBUG ("Both previous and current point to the payload: mode=" << payloadMode << ", psr=" << psr);
288
          NS_LOG_DEBUG ("Both previous and current point to the payload: mode=" << payloadMode << ", psr=" << psr);
311
        }
289
        }
312
      //Case 2: previous is before payload and current is in the payload
290
      //Case 2: This interval starts before the payload, but it does include it
313
      else if (current >= plcpPayloadStart)
291
      else if (startt < plcpPayloadStart && plcpPayloadStart <= endt)
314
        {
292
        {
315
          psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
293
          psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
316
                                                          noiseInterferenceW,
294
                                                          noiseInterferenceW,
317
                                                          txVector.GetChannelWidth ()),
295
                                                          txVector.GetChannelWidth ()),
318
                                            current - plcpPayloadStart,
296
                                            endt - plcpPayloadStart,
319
                                            payloadMode, txVector);
297
                                            payloadMode, txVector);
320
          NS_LOG_DEBUG ("previous is before payload and current is in the payload: mode=" << payloadMode << ", psr=" << psr);
298
          NS_LOG_DEBUG ("previous is before payload and current is in the payload: mode=" << payloadMode << ", psr=" << psr);
321
        }
299
        }
322
      noiseInterferenceW = j->second.GetPower () - powerW;
323
      previous = j->first;
324
    }
300
    }
325
  double per = 1 - psr;
301
  double per = 1 - psr;
326
  return per;
302
  return per;
327
}
303
}
328
304
329
double
305
double
330
InterferenceHelper::CalculatePlcpHeaderPer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
306
InterferenceHelper::CalculatePlcpHeaderPer (Ptr<const InterferenceHelper::Event> event, const NiChangesRange& ni) const
331
{
307
{
332
  NS_LOG_FUNCTION (this);
308
  NS_LOG_FUNCTION (this);
333
  const WifiTxVector txVector = event->GetTxVector ();
309
  const WifiTxVector txVector = event->GetTxVector ();
310
  const double powerW = event->GetRxPowerW ();
311
334
  double psr = 1.0; /* Packet Success Rate */
312
  double psr = 1.0; /* Packet Success Rate */
335
  auto j = ni->begin ();
313
  
336
  Time previous = j->first;
337
  WifiPreamble preamble = txVector.GetPreambleType ();
314
  WifiPreamble preamble = txVector.GetPreambleType ();
338
  WifiMode mcsHeaderMode;
315
  WifiMode mcsHeaderMode;
339
  if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF)
316
  if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF)
 Lines 352-373    Link Here 
352
      mcsHeaderMode = WifiPhy::GetHePlcpHeaderMode ();
329
      mcsHeaderMode = WifiPhy::GetHePlcpHeaderMode ();
353
    }
330
    }
354
  WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (txVector);
331
  WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (txVector);
355
  Time plcpHeaderStart = j->first + WifiPhy::GetPlcpPreambleDuration (txVector); //packet start time + preamble
332
  Time plcpHeaderStart = event->GetStartTime() + WifiPhy::GetPlcpPreambleDuration (txVector); //packet start time + preamble
356
  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (txVector); //packet start time + preamble + L-SIG
333
  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (txVector); //packet start time + preamble + L-SIG
357
  Time plcpTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble) + WifiPhy::GetPlcpSigA1Duration (preamble) + WifiPhy::GetPlcpSigA2Duration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A
334
  Time plcpTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble) + WifiPhy::GetPlcpSigA1Duration (preamble) + WifiPhy::GetPlcpSigA2Duration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A
358
  Time plcpPayloadStart = plcpTrainingSymbolsStart + WifiPhy::GetPlcpTrainingSymbolDuration (txVector) + WifiPhy::GetPlcpSigBDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
335
  Time plcpPayloadStart = plcpTrainingSymbolsStart + WifiPhy::GetPlcpTrainingSymbolDuration (txVector) + WifiPhy::GetPlcpSigBDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
359
  double noiseInterferenceW = m_firstPower;
336
  
360
  double powerW = event->GetRxPowerW ();
337
  for (auto j = ni.first, end = ni.second; j != end; ++j)
361
  while (++j != ni->end ())
362
    {
338
    {
363
      Time current = j->first;
339
      const Time startt = j->first.lower();
364
      NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
340
      const Time endt = j->first.upper();
365
      NS_ASSERT (current >= previous);
341
366
      //Case 1: previous and current after playload start: nothing to do
342
      const double noiseInterferenceW = j->second - powerW;
367
      if (previous >= plcpPayloadStart)
343
344
      NS_LOG_DEBUG ("startt= " << startt << ", endt=" << endt << ", noiseInterferenceW=" << noiseInterferenceW);
345
346
      //Case 1: interval after playload start: nothing to do
347
      if (startt >= plcpPayloadStart && endt >= plcpPayloadStart)
368
        {
348
        {
369
          psr *= 1;
349
          //psr *= 1;
370
          NS_LOG_DEBUG ("Case 1 - previous and current after playload start: nothing to do");
350
          NS_LOG_DEBUG ("Case 1 - interval after playload start: nothing to do");
371
        }
351
        }
372
      //Case 2: previous is in training or in SIG-B: legacy will not enter here since it didn't enter in the last two and they are all the same for legacy
352
      //Case 2: previous is in training or in SIG-B: legacy will not enter here since it didn't enter in the last two and they are all the same for legacy
373
      else if (previous >= plcpTrainingSymbolsStart)
353
      else if (previous >= plcpTrainingSymbolsStart)
 Lines 732-740    Link Here 
732
              NS_LOG_DEBUG ("Case 5d - previous is in the preamble and current is in L-SIG: mode=" << headerMode << ", psr=" << psr);
712
              NS_LOG_DEBUG ("Case 5d - previous is in the preamble and current is in L-SIG: mode=" << headerMode << ", psr=" << psr);
733
            }
713
            }
734
        }
714
        }
735
736
      noiseInterferenceW = j->second.GetPower () - powerW;
737
      previous = j->first;
738
    }
715
    }
739
716
740
  double per = 1 - psr;
717
  double per = 1 - psr;
 Lines 744-750    Link Here 
744
struct InterferenceHelper::SnrPer
721
struct InterferenceHelper::SnrPer
745
InterferenceHelper::CalculatePlcpPayloadSnrPer (Ptr<InterferenceHelper::Event> event) const
722
InterferenceHelper::CalculatePlcpPayloadSnrPer (Ptr<InterferenceHelper::Event> event) const
746
{
723
{
747
  NiChanges ni;
724
  NiChangesRange ni;
748
  double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
725
  double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
749
  double snr = CalculateSnr (event->GetRxPowerW (),
726
  double snr = CalculateSnr (event->GetRxPowerW (),
750
                             noiseInterferenceW,
727
                             noiseInterferenceW,
 Lines 753-759    Link Here 
753
  /* calculate the SNIR at the start of the packet and accumulate
730
  /* calculate the SNIR at the start of the packet and accumulate
754
   * all SNIR changes in the snir vector.
731
   * all SNIR changes in the snir vector.
755
   */
732
   */
756
  double per = CalculatePlcpPayloadPer (event, &ni);
733
  double per = CalculatePlcpPayloadPer (event, ni);
757
734
758
  struct SnrPer snrPer;
735
  struct SnrPer snrPer;
759
  snrPer.snr = snr;
736
  snrPer.snr = snr;
 Lines 764-770    Link Here 
764
struct InterferenceHelper::SnrPer
741
struct InterferenceHelper::SnrPer
765
InterferenceHelper::CalculatePlcpHeaderSnrPer (Ptr<InterferenceHelper::Event> event) const
742
InterferenceHelper::CalculatePlcpHeaderSnrPer (Ptr<InterferenceHelper::Event> event) const
766
{
743
{
767
  NiChanges ni;
744
  NiChangesRange ni;
768
  double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
745
  double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
769
  double snr = CalculateSnr (event->GetRxPowerW (),
746
  double snr = CalculateSnr (event->GetRxPowerW (),
770
                             noiseInterferenceW,
747
                             noiseInterferenceW,
 Lines 773-779    Link Here 
773
  /* calculate the SNIR at the start of the plcp header and accumulate
750
  /* calculate the SNIR at the start of the plcp header and accumulate
774
   * all SNIR changes in the snir vector.
751
   * all SNIR changes in the snir vector.
775
   */
752
   */
776
  double per = CalculatePlcpHeaderPer (event, &ni);
753
  double per = CalculatePlcpHeaderPer (event, ni);
777
754
778
  struct SnrPer snrPer;
755
  struct SnrPer snrPer;
779
  snrPer.snr = snr;
756
  snrPer.snr = snr;
 Lines 785-816    Link Here 
785
InterferenceHelper::EraseEvents (void)
762
InterferenceHelper::EraseEvents (void)
786
{
763
{
787
  m_niChanges.clear ();
764
  m_niChanges.clear ();
788
  // Always have a zero power noise event in the list
789
  AddNiChangeEvent (Time (0), NiChange (0.0, 0));
790
  m_rxing = false;
765
  m_rxing = false;
791
  m_firstPower = 0;
792
}
793
794
InterferenceHelper::NiChanges::const_iterator
795
InterferenceHelper::GetNextPosition (Time moment) const
796
{
797
  return m_niChanges.upper_bound (moment);
798
}
799
800
InterferenceHelper::NiChanges::const_iterator
801
InterferenceHelper::GetPreviousPosition (Time moment) const
802
{
803
  auto it = GetNextPosition (moment);
804
  // This is safe since there is always an NiChange at time 0,
805
  // before moment.
806
  --it;
807
  return it;
808
}
809
810
InterferenceHelper::NiChanges::iterator
811
InterferenceHelper::AddNiChangeEvent (Time moment, NiChange change)
812
{
813
  return m_niChanges.insert (GetNextPosition (moment), std::make_pair (moment, change));
814
}
766
}
815
767
816
void
768
void
 Lines 825-834    Link Here 
825
{
777
{
826
  NS_LOG_FUNCTION (this);
778
  NS_LOG_FUNCTION (this);
827
  m_rxing = false;
779
  m_rxing = false;
828
  //Update m_firstPower for frame capture
829
  auto it = m_niChanges.find (Simulator::Now ());
830
  it--;
831
  m_firstPower = it->second.GetPower ();
832
}
780
}
833
781
834
} //namespace ns3
782
} //namespace ns3
(-)a/src/wifi/model/interference-helper.h (-75 / +8 lines)
 Lines 27-32    Link Here 
27
#include "error-rate-model.h"
27
#include "error-rate-model.h"
28
#include <map>
28
#include <map>
29
29
30
#include <boost/icl/interval_map.hpp>
31
30
namespace ns3 {
32
namespace ns3 {
31
33
32
/**
34
/**
 Lines 204-251    Link Here 
204
206
205
207
206
private:
208
private:
207
  /**
209
  typedef boost::icl::interval_map<Time, double, boost::icl::partial_enricher> NiChanges;
208
   * Noise and Interference (thus Ni) event.
209
   */
210
  class NiChange
211
  {
212
public:
213
    /**
214
     * Create a NiChange at the given time and the amount of NI change.
215
     *
216
     * \param power the power
217
     * \param event causes this NI change
218
     */
219
    NiChange (double power, Ptr<InterferenceHelper::Event> event);
220
    /**
221
     * Return the power
222
     *
223
     * \return the power
224
     */
225
    double GetPower (void) const;
226
    /**
227
     * Add a given amount of power.
228
     *
229
     * \param power the power to be added to the existing value
230
     */
231
    void AddPower (double power);
232
    /**
233
     * Return the event causes the corresponding NI change
234
     *
235
     * \return the event
236
     */
237
    Ptr<InterferenceHelper::Event> GetEvent (void) const;
238
239
240
private:
241
    double m_power; ///< power
242
    Ptr<InterferenceHelper::Event> m_event; ///< event
243
  };
244
245
  /**
210
  /**
246
   * typedef for a multimap of NiChanges
211
   * typedef for a multimap of NiChanges
247
   */
212
   */
248
  typedef std::multimap<Time, NiChange> NiChanges;
213
  typedef std::pair<NiChanges::const_iterator, NiChanges::const_iterator> NiChangesRange;
249
214
250
  /**
215
  /**
251
   * Append the given Event.
216
   * Append the given Event.
 Lines 261-267    Link Here 
261
   *
226
   *
262
   * \return noise and interference power
227
   * \return noise and interference power
263
   */
228
   */
264
  double CalculateNoiseInterferenceW (Ptr<Event> event, NiChanges *ni) const;
229
  double CalculateNoiseInterferenceW (Ptr<Event> event, NiChangesRange *ni) const;
265
  /**
230
  /**
266
   * Calculate SNR (linear ratio) from the given signal power and noise+interference power.
231
   * Calculate SNR (linear ratio) from the given signal power and noise+interference power.
267
   * (Mode is not currently used)
232
   * (Mode is not currently used)
 Lines 294-300    Link Here 
294
   *
259
   *
295
   * \return the error rate of the packet
260
   * \return the error rate of the packet
296
   */
261
   */
297
  double CalculatePlcpPayloadPer (Ptr<const Event> event, NiChanges *ni) const;
262
  double CalculatePlcpPayloadPer (Ptr<const Event> event, const NiChangesRange& ni) const;
298
  /**
263
  /**
299
   * Calculate the error rate of the plcp header. The plcp header can be divided into
264
   * Calculate the error rate of the plcp header. The plcp header can be divided into
300
   * multiple chunks (e.g. due to interference from other transmissions).
265
   * multiple chunks (e.g. due to interference from other transmissions).
 Lines 304-350    Link Here 
304
   *
269
   *
305
   * \return the error rate of the packet
270
   * \return the error rate of the packet
306
   */
271
   */
307
  double CalculatePlcpHeaderPer (Ptr<const Event> event, NiChanges *ni) const;
272
  double CalculatePlcpHeaderPer (Ptr<const Event> event, const NiChangesRange& ni) const;
308
273
309
  double m_noiseFigure; /**< noise figure (linear) */
274
  double m_noiseFigure; /**< noise figure (linear) */
310
  Ptr<ErrorRateModel> m_errorRateModel; ///< error rate model
275
  Ptr<ErrorRateModel> m_errorRateModel; ///< error rate model
311
  uint8_t m_numRxAntennas; /**< the number of RX antennas in the corresponding receiver */
276
  uint8_t m_numRxAntennas; /**< the number of RX antennas in the corresponding receiver */
312
  /// Experimental: needed for energy duration calculation
277
  /// Experimental: needed for energy duration calculation
313
  NiChanges m_niChanges;
278
  NiChanges m_niChanges; // partial_enricher allows storing intervals with 0 power
314
  double m_firstPower; ///< first power
315
  bool m_rxing; ///< flag whether it is in receiving state
279
  bool m_rxing; ///< flag whether it is in receiving state
316
280
317
  /**
318
   * Returns an iterator to the first nichange that is later than moment
319
   *
320
   * \param moment time to check from
321
   * \returns an iterator to the list of NiChanges
322
   */
323
  NiChanges::const_iterator GetNextPosition (Time moment) const;
324
  /**
325
   * Returns an iterator to the first nichange that is later than moment
326
   *
327
   * \param moment time to check from
328
   * \returns an iterator to the list of NiChanges
329
   */
330
  //NiChanges::iterator GetNextPosition (Time moment);
331
  /**
332
   * Returns an iterator to the last nichange that is before than moment
333
   *
334
   * \param moment time to check from
335
   * \returns an iterator to the list of NiChanges
336
   */
337
  NiChanges::const_iterator GetPreviousPosition (Time moment) const;
338
339
  /**
340
   * Add NiChange to the list at the appropriate position and
341
   * return the iterator of the new event.
342
   *
343
   * \param moment
344
   * \param change
345
   * \returns the iterator of the new event
346
   */
347
  NiChanges::iterator AddNiChangeEvent (Time moment, NiChange change);
348
};
281
};
349
282
350
} //namespace ns3
283
} //namespace ns3

Return to bug 2947