libdrmconf 0.13.3
A library to program DMR radios.
Loading...
Searching...
No Matches
frequency.hh
1#ifndef FREQUENCY_HH
2#define FREQUENCY_HH
3
4#include <yaml-cpp/yaml.h>
5#include <QString>
6#include <QMetaType>
7#include <QList>
8#include <QPair>
9
10
14{
15public:
17 enum class Unit { Auto, Hz, kHz, MHz, GHz };
18
19protected:
21 FrequencyBase(qint64 hz) : _frequency(hz) {}
22
23public:
25 FrequencyBase(const FrequencyBase &other);
26
29
31 inline bool isNegative() const { return 0 > _frequency; }
33 inline bool isPositive() const { return 0 < _frequency; }
35 inline bool isZero() const { return 0 == _frequency; }
36
38 QString format(Unit unit = Unit::Auto) const;
40 bool parse(const QString &value, Qt::CaseSensitivity caseSensitivity = Qt::CaseInsensitive);
41
42 inline long long inHz() const { return _frequency; }
43 inline double inkHz() const { return double(_frequency)/1e3; }
44 inline double inMHz() const { return double(_frequency)/1e6; }
45 inline double inGHz() const { return double(_frequency)/1e9; }
46
48 Unit unit() const;
49
51 Unit unitFromString(const QString& input) const;
52
54 bool isMultipleOf(Unit unit) const;
55
57 static QString unitName(Unit unit);
58
59protected:
61 qint64 _frequency;
62};
63
64struct Frequency;
65
69{
70friend struct Frequency;
71protected:
73 FrequencyOffset(qint64 Hz) : FrequencyBase(Hz) { }
74
75public:
79 FrequencyOffset(const FrequencyOffset &other);
80
83
85 inline FrequencyOffset invert() const { return FrequencyOffset(this->_frequency * -1); }
86
88 inline FrequencyOffset abs() const {
89 return FrequencyOffset(std::abs(this->_frequency));
90 }
91
93 static FrequencyOffset fromString(const QString &freq);
94
95 static inline FrequencyOffset fromHz(qint64 Hz) { return FrequencyOffset(Hz); }
96 static inline FrequencyOffset fromkHz(double kHz) { return FrequencyOffset(kHz*1e3); }
97 static inline FrequencyOffset fromMHz(double MHz) { return FrequencyOffset(MHz*1e6); }
98 static inline FrequencyOffset fromGHz(double GHz) { return FrequencyOffset(GHz*1e6); }
99};
100
101
102
107{
108protected:
110 Frequency(quint64 hz);
111
112public:
114 Frequency();
116 Frequency(const Frequency &other);
117
119 Frequency &operator = (const Frequency &other);
120
121 inline bool operator< (const Frequency &other) const {
122 return _frequency < other._frequency;
123 }
124 inline bool operator <=(const Frequency &other) const {
125 return _frequency <= other._frequency;
126 }
127 inline bool operator== (const Frequency &other) const {
128 return _frequency == other._frequency;
129 }
130 inline bool operator != (const Frequency &other) const {
131 return _frequency != other._frequency;
132 }
133 inline bool operator> (const Frequency &other) const {
134 return _frequency > other._frequency;
135 }
136 inline bool operator >=(const Frequency &other) const {
137 return _frequency >= other._frequency;
138 }
139
142 Frequency operator+(const FrequencyOffset &offset) const;
146 FrequencyOffset operator-(const Frequency &other) const;
147
149 static Frequency fromString(const QString &freq);
150
151 inline quint64 inHz() const { return _frequency; }
152
153 static inline Frequency fromHz(quint64 Hz) { return Frequency(Hz); }
154 static inline Frequency fromkHz(double kHz) { return Frequency(kHz*1e3); }
155 static inline Frequency fromMHz(double MHz) { return Frequency(MHz*1e6); }
156 static inline Frequency fromGHz(double GHz) { return Frequency(GHz*1e6); }
157
158public:
160 template <class T>
162 {
163 protected:
164 typedef QList<QPair<Frequency, T>> container;
165 typedef typename container::const_iterator const_iterator;
166
167 public:
169 MapNearest(const QList<QPair<Frequency, T>> &items)
170 : _items(items)
171 {
172 // Sort items ascending.
173 std::sort(_items.begin(), _items.end(), compItem);
174 }
175
177 const_iterator
178 find(const Frequency &f) const {
179 auto lower = std::lower_bound(_items.begin(), _items.end(), f, compItemValue);
180
181 if (_items.begin() == lower)
182 return lower;
183
184 auto upper = lower--;
185 if (_items.end() == upper)
186 return lower;
187
188 if ((f.inHz()-lower->first.inHz()) < (upper->first.inHz()-f.inHz()))
189 return lower;
190
191 return upper;
192 }
193
195 T value(const Frequency &f) const {
196 return find(f)->second;
197 }
198
200 Frequency key(const Frequency &f) const {
201 return find(f)->first;
202 }
203
204 protected:
206 inline static bool compItem(const QPair<Frequency, T> &a, const QPair<Frequency, T> &b) {
207 return a.first < b.first;
208 }
209
211 inline static bool compItemValue(const QPair<Frequency, T> &a, const Frequency &b) {
212 return a.first < b;
213 }
214
215 protected:
217 container _items;
218 };
219};
220
221
222Q_DECLARE_METATYPE(Frequency)
223
224
225namespace YAML
226{
228 template<>
229 struct convert<Frequency>
230 {
232 static Node encode(const Frequency& rhs) {
233 return Node(rhs.format().toStdString());
234 }
235
237 static bool decode(const Node& node, Frequency& rhs) {
238 if (! node.IsScalar())
239 return false;
240 return rhs.parse(QString::fromStdString(node.as<std::string>()), Qt::CaseSensitive);
241 }
242 };
243}
244
245#endif // FREQUENCY_HH
T value(const Frequency &f) const
Returns the value associated with the nearest item for the given frequency.
Definition frequency.hh:195
static bool compItemValue(const QPair< Frequency, T > &a, const Frequency &b)
Comparison of item and frequency.
Definition frequency.hh:211
Frequency key(const Frequency &f) const
Returns the frequency of the nearest item for the given frequency.
Definition frequency.hh:200
container _items
All items.
Definition frequency.hh:217
const_iterator find(const Frequency &f) const
Searches for the nearest item to the given frequency.
Definition frequency.hh:178
MapNearest(const QList< QPair< Frequency, T > > &items)
Constructs a nearest frequency mapping.
Definition frequency.hh:169
static bool compItem(const QPair< Frequency, T > &a, const QPair< Frequency, T > &b)
Comparison of items by frequency.
Definition frequency.hh:206
Common base for all frequencies.
Definition frequency.hh:14
bool isMultipleOf(Unit unit) const
Checks if frequency is a multiple of unit.
Definition frequency.cc:153
FrequencyBase & operator=(const FrequencyBase &other)
Assignment.
Definition frequency.cc:21
FrequencyBase(qint64 hz)
Hidden constructor from offset in Hz.
Definition frequency.hh:21
bool isZero() const
Returns true of the frequency is zero.
Definition frequency.hh:35
double inkHz() const
Unit conversion.
Definition frequency.hh:43
qint64 _frequency
The actual frequency in Hz.
Definition frequency.hh:61
Unit unitFromString(const QString &input) const
Returns unit as type base on string input.
Definition frequency.cc:133
Unit
Frequency units.
Definition frequency.hh:17
long long inHz() const
Unit conversion.
Definition frequency.hh:42
QString format(Unit unit=Unit::Auto) const
Format the frequency.
Definition frequency.cc:27
static QString unitName(Unit unit)
Helper for string conversion of unit.
Definition frequency.cc:165
Unit unit() const
Returns the most appropriate unit for the frequency value.
Definition frequency.cc:121
double inMHz() const
Unit conversion.
Definition frequency.hh:44
bool isNegative() const
Returns true of the frequency is negative.
Definition frequency.hh:31
bool isPositive() const
Returns true of the frequency is positive.
Definition frequency.hh:33
double inGHz() const
Unit conversion.
Definition frequency.hh:45
bool parse(const QString &value, Qt::CaseSensitivity caseSensitivity=Qt::CaseInsensitive)
Parses a frequency.
Definition frequency.cc:56
Helper type to represent frequency differences aka offsets.
Definition frequency.hh:69
FrequencyOffset()
Default constructor.
Definition frequency.cc:181
static FrequencyOffset fromHz(qint64 Hz)
Unit conversion.
Definition frequency.hh:95
static FrequencyOffset fromkHz(double kHz)
Unit conversion.
Definition frequency.hh:96
static FrequencyOffset fromMHz(double MHz)
Unit conversion.
Definition frequency.hh:97
FrequencyOffset abs() const
Returns a positive frequency offset.
Definition frequency.hh:88
FrequencyOffset invert() const
Invert an offset.
Definition frequency.hh:85
FrequencyOffset(qint64 Hz)
Hidden constructor.
Definition frequency.hh:73
static FrequencyOffset fromString(const QString &freq)
Parses an offset.
Definition frequency.cc:200
static FrequencyOffset fromGHz(double GHz)
Unit conversion.
Definition frequency.hh:98
FrequencyOffset & operator=(const FrequencyOffset &other)
Assignment.
Definition frequency.cc:194
Helper type to encode frequencies without any rounding error.
Definition frequency.hh:107
static Frequency fromkHz(double kHz)
Unit conversion.
Definition frequency.hh:154
static Frequency fromString(const QString &freq)
Pareses a frequency.
Definition frequency.cc:250
bool operator<(const Frequency &other) const
Definition frequency.hh:121
bool operator>=(const Frequency &other) const
Definition frequency.hh:136
quint64 inHz() const
Unit conversion.
Definition frequency.hh:151
bool operator!=(const Frequency &other) const
Definition frequency.hh:130
static Frequency fromMHz(double MHz)
Unit conversion.
Definition frequency.hh:155
Frequency()
Default constructor.
Definition frequency.cc:219
bool operator>(const Frequency &other) const
Definition frequency.hh:133
Frequency(quint64 hz)
Hidden constructor from frequency in Hz.
Definition frequency.cc:213
static Frequency fromHz(quint64 Hz)
Unit conversion.
Definition frequency.hh:153
Frequency & operator=(const Frequency &other)
Assignment.
Definition frequency.cc:232
FrequencyOffset operator-(const Frequency &other) const
Frequency arithmetic.
Definition frequency.cc:245
Frequency & operator+=(const FrequencyOffset &offset)
Frequency arithmetic.
static Frequency fromGHz(double GHz)
Unit conversion.
Definition frequency.hh:156
bool operator==(const Frequency &other) const
Definition frequency.hh:127
Frequency operator+(const FrequencyOffset &offset) const
Frequency arithmetic.
Definition frequency.cc:238
bool operator<=(const Frequency &other) const
Definition frequency.hh:124
static Node encode(const Frequency &rhs)
Serializes the frequency.
Definition frequency.hh:232
static bool decode(const Node &node, Frequency &rhs)
Parses the frequency.
Definition frequency.hh:237