EMANE  1.2.1
spectrummonitor.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2014 - Adjacent Link LLC, Bridgewater, New Jersey
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in
13  * the documentation and/or other materials provided with the
14  * distribution.
15  * * Neither the name of Adjacent Link LLC nor the names of its
16  * contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef EMANEPHYSPECTRUMMONITOR_HEADER_
34 #define EMANEPHYSPECTRUMMONITOR_HEADER_
35 
36 #include "emane/types.h"
37 #include "emane/frequencysegment.h"
39 #include "noiserecorder.h"
40 
41 #include <set>
42 #include <map>
43 #include <vector>
44 #include <memory>
45 #include <tuple>
46 #include <mutex>
47 
48 namespace EMANE
49 {
51  {
52  public:
54 
55 
56  enum class NoiseMode {NONE, ALL, OUTOFBAND};
57 
58  void initialize(const FrequencySet & foi,
59  std::uint64_t u64BandwidthHz,
60  double dReceiverSensitivityMilliWatt,
61  NoiseMode mode,
62  const Microseconds & binSize,
63  const Microseconds & maxOffset,
64  const Microseconds & maxPropagation,
65  const Microseconds & maxDuration,
66  const Microseconds & timeSyncThreshold,
67  bool bMaxClamp);
68 
69  std::tuple<TimePoint,Microseconds,Microseconds,FrequencySegments,bool>
70  update(const TimePoint & now,
71  const TimePoint & txTime,
72  const Microseconds & propagationDelay,
73  const FrequencySegments & segments,
74  std::uint64_t u64SegmentBandwidthHz,
75  const std::vector<double> & rxPowersMilliWatt,
76  bool bInBand,
77  const std::vector<NEMId> & transmitters);
78 
79 
80  FrequencySet getFrequencies() const override;
81 
82  double getReceiverSensitivitydBm() const override;
83 
84  // test harness access
86  std::uint64_t u64FrequencyHz,
87  const Microseconds & duration = Microseconds::zero(),
88  const TimePoint & timepoint = TimePoint::min()) const;
89 
90 
91  SpectrumWindow request(std::uint64_t u64FrequencyHz,
92  const Microseconds & duration = Microseconds::zero(),
93  const TimePoint & timepoint = TimePoint::min()) const override;
94 
95 
96  std::vector<double> dump(std::uint64_t u64FrequencyHz) const;
97 
98  private:
99  using NoiseRecorderMap = std::map<std::uint64_t,std::unique_ptr<NoiseRecorder>>;
100  using Cache = std::map<std::uint64_t,std::vector<std::tuple<NoiseRecorder *,double,std::uint64_t>>>;
101  using TransmitterBandwidthCache = std::map<std::uint64_t,std::unique_ptr<Cache>>;
102  Microseconds binSize_;
103  Microseconds maxOffset_;
104  Microseconds maxPropagation_;
105  Microseconds maxDuration_;
106  bool bMaxClamp_;
107  Microseconds timeSyncThreshold_;
108  TransmitterBandwidthCache transmitterBandwidthCache_;
109  NoiseRecorderMap noiseRecorderMap_;
110  std::uint64_t u64ReceiverBandwidthHz_;
111  NoiseMode mode_;
112  double dReceiverSensitivityMilliWatt_;
113  mutable std::mutex mutex_;
114  };
115 }
116 
117 #endif // EMANEPHYSPECTRUMMONITOR_HEADER_
std::tuple< std::vector< double >, TimePoint, Microseconds, double, bool > SpectrumWindow
The SpectrumServiceProvider interface provides an API to request noise window information.
double getReceiverSensitivitydBm() const override
std::set< std::uint64_t > FrequencySet
std::tuple< TimePoint, Microseconds, Microseconds, FrequencySegments, bool > update(const TimePoint &now, const TimePoint &txTime, const Microseconds &propagationDelay, const FrequencySegments &segments, std::uint64_t u64SegmentBandwidthHz, const std::vector< double > &rxPowersMilliWatt, bool bInBand, const std::vector< NEMId > &transmitters)
std::chrono::microseconds Microseconds
Definition: types.h:45
void initialize(const FrequencySet &foi, std::uint64_t u64BandwidthHz, double dReceiverSensitivityMilliWatt, NoiseMode mode, const Microseconds &binSize, const Microseconds &maxOffset, const Microseconds &maxPropagation, const Microseconds &maxDuration, const Microseconds &timeSyncThreshold, bool bMaxClamp)
std::list< FrequencySegment > FrequencySegments
FrequencySet getFrequencies() const override
Clock::time_point TimePoint
Definition: types.h:50
SpectrumWindow request(std::uint64_t u64FrequencyHz, const Microseconds &duration=Microseconds::zero(), const TimePoint &timepoint=TimePoint::min()) const override
Definition: agent.h:43
std::vector< double > dump(std::uint64_t u64FrequencyHz) const
SpectrumWindow request_i(const TimePoint &now, std::uint64_t u64FrequencyHz, const Microseconds &duration=Microseconds::zero(), const TimePoint &timepoint=TimePoint::min()) const