-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparameter.h
More file actions
560 lines (466 loc) · 18.4 KB
/
parameter.h
File metadata and controls
560 lines (466 loc) · 18.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
#ifndef PARAMETER_H
#define PARAMETER_H
#include <QString>
#include <QVariant>
#include <stdint.h>
#include <math.h>
#include "drive_types.h"
#include "parameters_ids.h"
/**
* @brief Базовый класс параметра привода.
*/
class ParameterBase
{
public:
ParameterBase() {}
virtual ~ParameterBase() {}
virtual int toInt() const = 0;
virtual unsigned int toUInt() const = 0;
virtual float toFloat() const = 0;
virtual uint16_t toRaw() const = 0;
virtual void setInt(int val) = 0;
virtual void setUInt(unsigned int val) = 0;
virtual void setFloat(float val) = 0;
virtual void setRaw(uint16_t val) = 0;
virtual void setRange(int min_val, int max_val) = 0;
virtual void setRange(unsigned int min_val, unsigned int max_val) = 0;
virtual void setRange(float min_val, float max_val) = 0;
virtual void setDefault(int def_val) = 0;
virtual void setDefault(unsigned int def_val) = 0;
virtual void setDefault(float def_val) = 0;
virtual int minToInt() const = 0;
virtual unsigned int minToUInt() const = 0;
virtual float minToFloat() const = 0;
virtual int maxToInt() const = 0;
virtual unsigned int maxToUInt() const = 0;
virtual float maxToFloat() const = 0;
virtual int defToInt() const = 0;
virtual unsigned int defToUInt() const = 0;
virtual float defToFloat() const = 0;
virtual bool validate(int val) const = 0;
virtual bool validate(unsigned int val) const = 0;
virtual bool validate(float val) const = 0;
virtual void applyDefault() = 0;
};
/**
* @brief Класс параметра привода.
*/
class Parameter
:public ParameterBase
{
public:
/**
* @brief Конструктор.
* @param param_type Тип параметра.
*/
explicit Parameter(param_type_t parameter_type);
/**
* @brief Конструктор.
* @param parameter_type Тип параметра.
* @param parameter_id Идентификатор параметра.
*/
Parameter(param_type_t parameter_type, param_id_t parameter_id);
/**
* @brief Конструктор из дескриптора.
* @param parameter_descr Дескриптор параметра.
*/
Parameter(const param_descr_t* parameter_descr);
~Parameter();
/**
* @brief Получает тип параметра.
* @return Тип параметра.
*/
param_type_t type() const;
/**
* @brief Получает идентификатор параметра.
* @return Идентификатор параметра.
*/
param_id_t id() const;
/**
* @brief Устанавливает идентификатор параметра.
* @param parameter_id Идентификатор параметра.
*/
void setId(param_id_t parameter_id);
/**
* @brief Получает флаги параметра.
* @return Флаги параметра.
*/
param_flags_t flags() const;
/**
* @brief Устанавливает флаги параметра.
* @param parameter_flags Флаги параметра.
*/
void setFlags(param_flags_t parameter_flags);
/**
* @brief Получает единицу измерения параметра.
* @return Единица измерения параметра.
*/
param_units_t units() const;
/**
* @brief Получает единицу измерения параметра.
* @param parameter_units Единица измерения параметра.
*/
void setUnits(param_units_t parameter_units);
/**
* @brief Получает значение параметра.
* @return Знчение параметра.
*/
QVariant toVariant() const;
/**
* @brief Получает строковое представление значения параметра.
* @return Строковое представление значения параметра.
*/
QString toString() const;
/**
* @brief Получает строковое представление минимального значения параметра.
* @return Строковое представление минимального значения параметра.
*/
QString minToString() const;
/**
* @brief Получает строковое представление максимального значения параметра.
* @return Строковое представление максимального значения параметра.
*/
QString maxToString() const;
/**
* @brief Получает строковое представление значения по-умолчанию параметра.
* @return Строковое представление значения по-умолчанию параметра.
*/
QString defToString() const;
/**
* @brief Получает целочисленное знаковое значение параметра.
* @return Целочисленное знаковое значение параметра.
*/
int toInt() const;
/**
* @brief Получает целочисленное беззнаковое значение параметра.
* @return Целочисленное беззнаковое значение параметра.
*/
unsigned int toUInt() const;
/**
* @brief Получает значение с плавающей запятой.
* @return Значение с плавающей запятой.
*/
float toFloat() const;
/**
* @brief Получает сырое(упакованное) значение
* для передачи в привод.
* @return Сырое(упакованное) значение.
*/
uint16_t toRaw() const;
/**
* @brief Получает значение параметра.
* @return Знчение параметра.
*/
void setVariant(const QVariant& val);
/**
* @brief Устанавливает целочисленное знаковое значение.
* @param val Целочисленное знаковое значение.
*/
void setInt(int val);
/**
* @brief Устанавливает целочисленное беззнаковое значение.
* @param val Целочисленное беззнаковое значение.
*/
void setUInt(unsigned int val);
/**
* @brief Устанавливает значение с плавающей запятой.
* @param val Значение с плавающей запятой.
*/
void setFloat(float val);
/**
* @brief Устанавливает сырое(упакованное) значение,
* полученное от привода.
* @param val Сырое(упакованное значение).
*/
void setRaw(uint16_t val);
/**
* @brief Устанавливает диапазон значений.
* @param min_val Минимальное значение.
* @param max_val Максимальное значение.
*/
void setRange(int min_val, int max_val);
/**
* @brief Устанавливает диапазон значений.
* @param min_val Минимальное значение.
* @param max_val Максимальное значение.
*/
void setRange(unsigned int min_val, unsigned int max_val);
/**
* @brief Устанавливает диапазон значений.
* @param min_val Минимальное значение.
* @param max_val Максимальное значение.
*/
void setRange(float min_val, float max_val);
/**
* @brief Устанавливает значение по-умолчанию.
* @param def_val Значение по-умолчанию.
*/
void setDefault(int def_val);
/**
* @brief Устанавливает значение по-умолчанию.
* @param def_val Значение по-умолчанию.
*/
void setDefault(unsigned int def_val);
/**
* @brief Устанавливает значение по-умолчанию.
* @param def_val Значение по-умолчанию.
*/
void setDefault(float def_val);
/**
* @brief Получает минимальное значение.
* @return Минимальное значение.
*/
int minToInt() const;
/**
* @brief Получает минимальное значение.
* @return Минимальное значение.
*/
unsigned int minToUInt() const;
/**
* @brief Получает минимальное значение.
* @return Минимальное значение.
*/
float minToFloat() const;
/**
* @brief Получает максимальное значение.
* @return Максимальное значение.
*/
int maxToInt() const;
/**
* @brief Получает максимальное значение.
* @return Максимальное значение.
*/
unsigned int maxToUInt() const;
/**
* @brief Получает максимальное значение.
* @return Максимальное значение.
*/
float maxToFloat() const;
/**
* @brief Получает значение по-умолчанию.
* @return Значение по-умолчанию.
*/
int defToInt() const;
/**
* @brief Получает значение по-умолчанию.
* @return Значение по-умолчанию.
*/
unsigned int defToUInt() const;
/**
* @brief Получает значение по-умолчанию.
* @return Значение по-умолчанию.
*/
float defToFloat() const;
/**
* @brief Проверяет вхождение значения в допустимый диапазон.
* @param val Значение.
* @return Флаг вхождения значения в допустимый диапазон.
*/
bool validate(int val) const;
/**
* @brief Проверяет вхождение значения в допустимый диапазон.
* @param val Значение.
* @return Флаг вхождения значения в допустимый диапазон.
*/
bool validate(unsigned int val) const;
/**
* @brief Проверяет вхождение значения в допустимый диапазон.
* @param val Значение.
* @return Флаг вхождения значения в допустимый диапазон.
*/
bool validate(float val) const;
/**
* @brief Применяет значение по-умолчанию.
*/
void applyDefault();
/**
* @brief Получает дескриптор параметра по
* идентификатору в сортированном массиве
* дескрипторов параметров.
* @param parameter_id Идентификатор параметра.
* @return Указатель на дескриптор, либо nullptr.
*/
static const param_descr_t* descrById(param_id_t parameter_id);
/**
* @brief Создаёт параметр по дескриптору,
* который получает по идентификатору в
* сортированном массиве дескрипторов параметров.
* @param parameter_id Идентификатор параметра.
* @return Параметр, либо nullptr.
*/
static Parameter* byId(param_id_t parameter_id);
/**
* @brief Получает строковое представление значения согласно типа параметра.
* @param param_type Тип параметра.
* @param val Значение.
* @return Строковое представление.
*/
static QString number(param_type_t param_type, int val);
/**
* @brief Получает строковое представление значения согласно типа параметра.
* @param param_type Тип параметра.
* @param val Значение.
* @return Строковое представление.
*/
static QString number(param_type_t param_type, unsigned int val);
/**
* @brief Получает строковое представление значения согласно типа параметра.
* @param param_type Тип параметра.
* @param val Значение.
* @return Строковое представление.
*/
static QString number(param_type_t param_type, float val);
protected:
Parameter();
ParameterBase* param;
param_type_t param_type;
param_id_t param_id;
param_flags_t param_flags;
param_units_t param_units;
static float fixed32_to_float(fixed32_t f);
};
/**
* @brief Шаблонный класс реализации параметра со значением заданного типа.
*/
template <typename T>
class ParameterImpl
:public ParameterBase
{
public:
ParameterImpl() :ParameterBase()
{ value = T(); value_def = T();
value_min = T(); value_max = T(); }
~ParameterImpl() {}
int toInt() const
{ return static_cast<int>(value); }
unsigned int toUInt() const
{ return static_cast<unsigned int>(value); }
float toFloat() const
{ return static_cast<float>(value); }
uint16_t toRaw() const
{ return static_cast<uint16_t>(value); }
void setInt(int val)
{ value = static_cast<T>(val); }
void setUInt(unsigned int val)
{ value = static_cast<T>(val); }
void setFloat(float val)
{ value = static_cast<T>(val); }
void setRaw(uint16_t val)
{ value = static_cast<T>(val); }
void setRange(int min_val, int max_val)
{ value_min = static_cast<T>(min_val); value_max = static_cast<T>(max_val); }
void setRange(unsigned int min_val, unsigned int max_val)
{ value_min = static_cast<T>(min_val); value_max = static_cast<T>(max_val); }
void setRange(float min_val, float max_val)
{ value_min = static_cast<T>(min_val); value_max = static_cast<T>(max_val); }
void setDefault(int def_val)
{ value_def = static_cast<T>(def_val); }
void setDefault(unsigned int def_val)
{ value_def = static_cast<T>(def_val); }
void setDefault(float def_val)
{ value_def = static_cast<T>(def_val); }
int minToInt() const
{ return static_cast<int>(value_min); }
unsigned int minToUInt() const
{ return static_cast<unsigned int>(value_min); }
float minToFloat() const
{ return static_cast<float>(value_min); }
int maxToInt() const
{ return static_cast<int>(value_max); }
unsigned int maxToUInt() const
{ return static_cast<unsigned int>(value_max); }
float maxToFloat() const
{ return static_cast<float>(value_max); }
int defToInt() const
{ return static_cast<int>(value_def); }
unsigned int defToUInt() const
{ return static_cast<unsigned int>(value_def); }
float defToFloat() const
{ return static_cast<float>(value_def); }
bool validate(int val) const
{ return (static_cast<T>(val) >= value_min) && (static_cast<T>(val) <= value_max); }
bool validate(unsigned int val) const
{ return (static_cast<T>(val) >= value_min) && (static_cast<T>(val) <= value_max); }
bool validate(float val) const
{ return (static_cast<T>(val) >= value_min) && (static_cast<T>(val) <= value_max); }
void applyDefault()
{ value = value_def; }
protected:
T value;
T value_min;
T value_max;
T value_def;
};
/**
* @brief Класс параметра с целочисленным знаковым значением.
*/
class ParameterInt
:public ParameterImpl<int>
{
public:
ParameterInt() :ParameterImpl<int>() {}
~ParameterInt() {}
void setRaw(uint16_t val)
{ value = static_cast<int>(static_cast<int16_t>(val)); }
};
/**
* @brief Тип параметра с целочисленным беззнаковым значением.
*/
typedef ParameterImpl<unsigned int> ParameterUInt;
/**
* @brief Класс параметра со значение с плавающей запятой и точностью 0.1.
*/
class ParameterFract10
:public ParameterImpl<float>
{
public:
ParameterFract10() :ParameterImpl<float>() {}
~ParameterFract10() {}
uint16_t toRaw() const
{ return static_cast<uint16_t>(floor(value * 10.0f + 0.5f)); }
void setRaw(uint16_t val)
{ value = static_cast<float>(static_cast<int16_t>(val)) / 10.0f; }
};
/**
* @brief Класс параметра со значение с плавающей запятой и точностью 0.01.
*/
class ParameterFract100
:public ParameterImpl<float>
{
public:
ParameterFract100() :ParameterImpl<float>() {}
~ParameterFract100() {}
uint16_t toRaw() const
{ return static_cast<uint16_t>(floor(value * 100.0f + 0.5f)); }
void setRaw(uint16_t val)
{ value = static_cast<float>(static_cast<int16_t>(val)) / 100.0f; }
};
/**
* @brief Класс параметра со значение с плавающей запятой и точностью 0.001.
*/
class ParameterFract1000
:public ParameterImpl<float>
{
public:
ParameterFract1000() :ParameterImpl<float>() {}
~ParameterFract1000() {}
uint16_t toRaw() const
{ return static_cast<uint16_t>(floor(value * 1000.0f + 0.5f)); }
void setRaw(uint16_t val)
{ value = static_cast<float>(static_cast<int16_t>(val)) / 1000.0f; }
};
/**
* @brief Класс параметра со значение с плавающей запятой и точностью 0.0001.
*/
class ParameterFract10000
:public ParameterImpl<float>
{
public:
ParameterFract10000() :ParameterImpl<float>() {}
~ParameterFract10000() {}
uint16_t toRaw() const
{ return static_cast<uint16_t>(floor(value * 10000.0f + 0.5f)); }
void setRaw(uint16_t val)
{ value = static_cast<float>(static_cast<int16_t>(val)) / 10000.0f; }
};
#endif // PARAMETER_H