-
-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathrender_base.hpp
404 lines (330 loc) · 10.1 KB
/
render_base.hpp
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
#pragma once
//=========================================================================//
/*! @file
@brief 描画ベースクラス
@author 平松邦仁 (hira@rvf-rc45.net)
@copyright Copyright (C) 2020, 2022 Kunihito Hiramatsu @n
Released under the MIT license @n
https://github.com/hirakuni45/RX/blob/master/LICENSE
*/
//=========================================================================//
#include "graphics/color.hpp"
#include "common/string_utils.hpp"
namespace dsos {
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 波形描画ベース・クラス
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
struct render_base {
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 操作ターゲット型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class TARGET : uint8_t {
CH0, ///< CH0 電圧軸操作
CH1, ///< CH1 電圧軸操作
};
/// チャネル・倍率文字列
static constexpr char CH_MULT_STR[] = "X1,X10";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief チャネル・倍率型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class CH_MULT : uint8_t {
X1, ///< X1 プローブ
X10 ///< X10 プローブ
};
const char* get_ch_mult_str(CH_MULT mult)
{
static char tmp[8];
tmp[0] = 0;
auto n = static_cast<uint8_t>(mult);
utils::str::get_word(CH_MULT_STR, n, tmp, sizeof(tmp), ',');
return tmp;
}
/// チャネル・モード文字列
static constexpr char CH_MODE_STR[] = "AC,GND,DC,OFF";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief チャネル・モード型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class CH_MODE : uint8_t {
AC, ///< AC モード
GND, ///< GND 固定
DC, ///< DC モード
OFF ///< チャネル OFF
};
const char* get_ch_mode_str(CH_MODE mode)
{
static char tmp[8];
tmp[0] = 0;
auto n = static_cast<uint8_t>(mode);
utils::str::get_word(CH_MODE_STR, n, tmp, sizeof(tmp), ',');
return tmp;
}
/// チャネル・電圧文字列
static constexpr char CH_VOLT_STR[] = "10V,5V,2V,1V,500mV,200mV,100mV,50mV,25mV";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 電圧レンジ型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class CH_VOLT : uint8_t {
_10V, ///< 10V/div
_5V, ///< 5V/div
_2V, ///< 2V/div
_1V, ///< 1V/div
_500mV, ///< 500mV/div
_200mV, ///< 200mV/div
_100mV, ///< 100mV/div
_50mV, ///< 50mV/div
_25mV ///< 25mV/div
};
static constexpr int32_t VOLT_MV[] = { // mV 単位
10000, ///< 10000mV (10.0V)
5000, ///< 5000mV (5.0V)
2000, ///< 2000mV (2.0V)
1000, ///< 1000mV (1.0V)
500, ///< 500mV (0.5V)
200, ///< 200mV (0.2V)
100, ///< 100mV (0.1V)
50, ///< 50mV (0.05V)
25 ///< 25mV (0.025V)
};
const char* get_ch_volt_str(CH_VOLT volt)
{
static char tmp[8];
tmp[0] = 0;
auto n = static_cast<uint8_t>(volt);
utils::str::get_word(CH_VOLT_STR, n, tmp, sizeof(tmp), ',');
return tmp;
}
static int32_t get_mvolt(CH_VOLT val)
{
return VOLT_MV[static_cast<uint8_t>(val)];
}
/// トリガー文字列
static constexpr char TRG_MODE_STR[] = "Stop,Single,Auto,CH0-Pos,CH0-Neg,CH1-Pos,CH1-Neg";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief トリガー型 @n
'_' が前にある型は、capture クラスが内部的に利用している。
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class TRG_MODE : uint8_t {
STOP, ///< 何もしない
SINGLE, ///< シングル・ショット
AUTO, ///< オートモード
CH0_POS, ///< CH0 立ち上がりエッジ
CH0_NEG, ///< CH0 立ち下がりエッジ
CH1_POS, ///< CH1 立ち上がりエッジ
CH1_NEG, ///< CH1 立ち下がりエッジ
_CH0_POSA, ///< CH0 立ち上がりエッジ後
_CH1_POSA, ///< CH1 立ち上がりエッジ後
_CH0_NEGA, ///< CH0 立ち下がりエッジ後
_CH1_NEGA, ///< CH1 立ち下がりエッジ後
_BEFORE, ///< 前処理(電圧ディバイダーを設定する)
_TRG_BEFORE,///< ※内部処理 トリガー前処理
_TRG_AFTER, ///< ※内部処理 トリガー後処理
};
const char* get_trg_mode_str(TRG_MODE trg)
{
static char tmp[16];
tmp[0] = 0;
auto n = static_cast<uint8_t>(trg);
utils::str::get_word(TRG_MODE_STR, n, tmp, sizeof(tmp), ',');
return tmp;
}
/// サンプリング・ユニット文字列
static constexpr char SMP_UNIT_STR[] = "1us,10us,100us,1ms,10ms";
/// サンプリング・ファイン文字列
static constexpr char SMP_FINE0_STR[] = "1us,2us,5us";
static constexpr char SMP_FINE1_STR[] = "10us,20us,50us";
static constexpr char SMP_FINE2_STR[] = "100us,200us,500us";
static constexpr char SMP_FINE3_STR[] = "1ms,2ms,5ms";
static constexpr char SMP_FINE4_STR[] = "10ms,20ms,50ms";
static constexpr uint8_t SMP_FINE_NUM = 3;
/// サンプリング時間(マイクロ秒)
static constexpr int32_t SMP_RATE_US[] = {
1, 2, 5,
10, 20, 50,
100, 200, 500,
1000, 2000, 5000,
10000, 20000, 50000
};
enum class SMP_MODE : uint8_t {
_1us, _2us, _5us,
_10us, _20us, _50us,
_100us, _200us, _500us,
_1ms, _2ms, _5ms,
_10ms, _20ms, _50ms
};
static const char* get_smp_str(SMP_MODE smp)
{
auto p = static_cast<uint8_t>(smp);
auto n = p / SMP_FINE_NUM;
auto m = p % SMP_FINE_NUM;
const char* unit = nullptr;
switch(n) {
case 0:
unit = SMP_FINE0_STR;
break;
case 1:
unit = SMP_FINE1_STR;
break;
case 2:
unit = SMP_FINE2_STR;
break;
case 3:
unit = SMP_FINE3_STR;
break;
case 4:
unit = SMP_FINE4_STR;
break;
default:
break;
}
static char tmp[16];
tmp[0] = 0;
if(unit != nullptr) {
utils::str::get_word(unit, m, tmp, sizeof(tmp), ',');
}
return tmp;
}
static int32_t get_smp_rate(SMP_MODE smp)
{
return SMP_RATE_US[static_cast<uint8_t>(smp)];
}
/// A/D 変換サンプリングレート(KHz)
static constexpr int16_t AD_SAMPLE_RATE[] = {
2000, 2000, 2000,
2000, 2000, 2000,
2000, 2000, 2000,
1000, 500, 200,
100, 50, 20
};
/// 計測メニュー文字列
static constexpr char MES_MODE_STR[] = "Off,Time Sub,CH0 Sub,CH1 Sub,Time Abs,CH0 Abs,CH1 Abs";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 計測型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class MEASERE : uint8_t {
OFF,
TIME_SUB, ///< 時間差分
CH0_SUB, ///< CH0 差分
CH1_SUB, ///< CH1 差分
TIME_ABS, ///< 時間絶対値
CH0_ABS, ///< CH0 絶対値
CH1_ABS ///< CH1 絶対値
};
/// オプションメニュー文字列
static constexpr char OPTION_STR[] = "NONE,Capture,Save-WAV,CH0-FFT,CH1-FFT";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief オプション型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class OPT_MODE : uint8_t {
NONE, ///< 何もしない
CAPTURE, ///< 画面をキャプチャーして画像ファイルとしてセーブ(480x272)
SAVE_WAVE, ///< 波形を WAV 形式でセーブ
CH0_FFT, ///< CH0 FFT
CH1_FFT, ///< CH1 FFT
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 波形型(テスト波形生成)
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class PWAVE_TYPE : uint8_t {
SIN, ///< sin
COS, ///< cos
TRI_S, ///< 三角波(sin)
TRI_C, ///< 三角波(cos)
SQU_S, ///< 矩形波(sin)
SQU_C, ///< 矩形波(cos)
FSQU_S, ///< フィルター矩形波(sin)
FSQU_C, ///< フィルター矩形波(cos)
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 波形情報クラス
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
struct wave_info {
int16_t min_;
int16_t max_;
int32_t org_;
int32_t end_;
float freq_;
private:
int16_t thv_org_;
int16_t thv_end_;
uint16_t step_;
public:
wave_info() noexcept :
min_(0), max_(0), org_(0), end_(0), freq_(0.0f),
thv_org_(0), thv_end_(0), step_(0)
{ }
void setup() noexcept
{
thv_org_ = (min_ + max_) / 2;
thv_end_ = (thv_org_ + min_) / 2;
step_ = 0;
}
void update(int16_t v, int32_t pos) noexcept
{
switch(step_) {
case 0:
if(v < thv_end_) {
++step_;
}
break;
case 1:
if(v > thv_org_) {
org_ = pos;
step_++;
}
break;
case 2:
if(v < thv_end_) {
step_++;
}
break;
case 3:
if(v > thv_org_) {
end_ = pos;
step_++;
}
break;
default:
break;
}
}
bool probe() const noexcept { return step_ == 4; }
bool build(uint32_t samplerate) noexcept
{
freq_ = 0.0f;
if(!probe()) return false;
auto d = end_ - org_;
if(d == 0) return false;
freq_ = static_cast<float>(samplerate) / static_cast<float>(d);
return true;
}
};
typedef graphics::def_color DEF_COLOR;
static constexpr graphics::share_color CH0_COLOR = DEF_COLOR::Yellow; ///< チャネル0カラー
static constexpr graphics::share_color CH1_COLOR = DEF_COLOR::Fuchsi; ///< チャネル1カラー
static constexpr graphics::share_color TRG_COLOR = DEF_COLOR::Orange; ///< トリガーカラー
static constexpr graphics::share_color SMP_COLOR = DEF_COLOR::SafeColor; ///< サンプルカラー
static constexpr graphics::share_color MES_COLOR = DEF_COLOR::Green; ///< 計測カラー
render_base() noexcept
{ }
};
}