CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラム.雛形として使う. http://seminar.cqpub.co.jp/ccm/ES18-0020
Dependencies: F746_GUI F746_SAI_IO mbed
MyFiles/LcdPanelFrq.hpp@5:976ef47a7f25, 2018-03-20 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Mar 20 11:15:47 2018 +0000
- Revision:
- 5:976ef47a7f25
- Parent:
- 3:05c8d0ee9c37
6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:b6d17af0f47a | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:b6d17af0f47a | 2 | // ディジタルフィルタ実験のためのプラットフォームの |
MikamiUitOpen | 0:b6d17af0f47a | 3 | // LCD パネル表示と入力信号の周波数設定で使う |
MikamiUitOpen | 0:b6d17af0f47a | 4 | // |
MikamiUitOpen | 0:b6d17af0f47a | 5 | // 2017/08/21, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:b6d17af0f47a | 6 | //----------------------------------------------------------- |
MikamiUitOpen | 0:b6d17af0f47a | 7 | |
MikamiUitOpen | 0:b6d17af0f47a | 8 | #ifndef PANEL_MANIPULATOR_HPP |
MikamiUitOpen | 0:b6d17af0f47a | 9 | #define PANEL_MANIPULATOR_HPP |
MikamiUitOpen | 0:b6d17af0f47a | 10 | |
MikamiUitOpen | 0:b6d17af0f47a | 11 | #include "F746_GUI.hpp" |
MikamiUitOpen | 0:b6d17af0f47a | 12 | #include "NumericUpDown.hpp" |
MikamiUitOpen | 0:b6d17af0f47a | 13 | #include "Zoom.hpp" |
MikamiUitOpen | 0:b6d17af0f47a | 14 | #include "WaveformDisplay.hpp" |
MikamiUitOpen | 0:b6d17af0f47a | 15 | #include "Trigger.hpp" |
MikamiUitOpen | 0:b6d17af0f47a | 16 | |
MikamiUitOpen | 0:b6d17af0f47a | 17 | namespace Mikami |
MikamiUitOpen | 0:b6d17af0f47a | 18 | { |
MikamiUitOpen | 0:b6d17af0f47a | 19 | class LcdPanel |
MikamiUitOpen | 0:b6d17af0f47a | 20 | { |
MikamiUitOpen | 0:b6d17af0f47a | 21 | public: |
MikamiUitOpen | 0:b6d17af0f47a | 22 | // ts : 標本化間隔(単位:μs) |
MikamiUitOpen | 0:b6d17af0f47a | 23 | LcdPanel(float ts) |
MikamiUitOpen | 0:b6d17af0f47a | 24 | : TS_(ts), lcd_(GuiBase::GetLcd()), |
MikamiUitOpen | 0:b6d17af0f47a | 25 | xnD_(N_DISP_BUF_), ynD_(N_DISP_BUF_), frq_(1000), |
MikamiUitOpen | 0:b6d17af0f47a | 26 | dPhi_(PI2_*frq_*TS_), phi_(0), factor_(1) |
MikamiUitOpen | 0:b6d17af0f47a | 27 | { |
MikamiUitOpen | 0:b6d17af0f47a | 28 | Label title(240, 10, "Digital Filter LAB", Label::CENTER, Font16); |
MikamiUitOpen | 0:b6d17af0f47a | 29 | |
MikamiUitOpen | 0:b6d17af0f47a | 30 | const uint16_t Y0 = 170; |
MikamiUitOpen | 0:b6d17af0f47a | 31 | // 凡例 |
MikamiUitOpen | 0:b6d17af0f47a | 32 | lcd_.SetTextColor(LINE_COLOR1_); |
MikamiUitOpen | 0:b6d17af0f47a | 33 | lcd_.DrawHLine(360, Y0+6, 50); |
MikamiUitOpen | 0:b6d17af0f47a | 34 | Label label1(420, Y0, "Input"); |
MikamiUitOpen | 0:b6d17af0f47a | 35 | lcd_.SetTextColor(LINE_COLOR2_); |
MikamiUitOpen | 0:b6d17af0f47a | 36 | lcd_.DrawHLine(360, Y0+26, 50); |
MikamiUitOpen | 0:b6d17af0f47a | 37 | Label label2(420, Y0+20, "Output"); |
MikamiUitOpen | 0:b6d17af0f47a | 38 | |
MikamiUitOpen | 3:05c8d0ee9c37 | 39 | // 表示するデータ数: 400個 |
MikamiUitOpen | 0:b6d17af0f47a | 40 | waveDisp_ = new WaveformDisplay(lcd_, 30, 90, xnD_, ynD_, 400, 8, |
MikamiUitOpen | 0:b6d17af0f47a | 41 | AXIS_COLOR_, |
MikamiUitOpen | 0:b6d17af0f47a | 42 | LINE_COLOR1_, LINE_COLOR2_, |
MikamiUitOpen | 0:b6d17af0f47a | 43 | BACK_COLOR_); |
MikamiUitOpen | 0:b6d17af0f47a | 44 | |
MikamiUitOpen | 0:b6d17af0f47a | 45 | // GUI 設定 |
MikamiUitOpen | 0:b6d17af0f47a | 46 | ud_ = new NumericUpDown(4, 0, 271, frq_, 9999, 100, "Hz"); |
MikamiUitOpen | 0:b6d17af0f47a | 47 | bar_ = new SeekBar(230, 250, 230, |
MikamiUitOpen | 0:b6d17af0f47a | 48 | log10f(MIN_FRQ_), log10f(MAX_FRQ_), log10f(1000), |
MikamiUitOpen | 0:b6d17af0f47a | 49 | "0.1", "1.0", "10.0"); |
MikamiUitOpen | 0:b6d17af0f47a | 50 | // 時間軸の拡大率は 8 倍まで |
MikamiUitOpen | 0:b6d17af0f47a | 51 | zmButton_ = new ZoomButton(240, Y0, 40, 30, 8); |
MikamiUitOpen | 0:b6d17af0f47a | 52 | } |
MikamiUitOpen | 0:b6d17af0f47a | 53 | |
MikamiUitOpen | 0:b6d17af0f47a | 54 | // 正弦波の発生で使う値の更新し,取得する |
MikamiUitOpen | 0:b6d17af0f47a | 55 | float GetPhi() |
MikamiUitOpen | 0:b6d17af0f47a | 56 | { |
MikamiUitOpen | 0:b6d17af0f47a | 57 | if ((phi_ += dPhi_) > PI2_) phi_ -= PI2_; |
MikamiUitOpen | 0:b6d17af0f47a | 58 | return phi_; |
MikamiUitOpen | 0:b6d17af0f47a | 59 | } |
MikamiUitOpen | 0:b6d17af0f47a | 60 | |
MikamiUitOpen | 0:b6d17af0f47a | 61 | // 周波数設定の更新とズームイン/アウト・ボタンの処理 |
MikamiUitOpen | 0:b6d17af0f47a | 62 | void Update() |
MikamiUitOpen | 0:b6d17af0f47a | 63 | { |
MikamiUitOpen | 0:b6d17af0f47a | 64 | if (bar_->Slide()) // SeekBar をスライドした場合の処理 |
MikamiUitOpen | 0:b6d17af0f47a | 65 | { |
MikamiUitOpen | 0:b6d17af0f47a | 66 | frq_ = (int)(powf(10, bar_->GetValue())+0.5f); |
MikamiUitOpen | 0:b6d17af0f47a | 67 | if (frq_ >= MAX_FRQ_) frq_ = MAX_FRQ_ - 1; |
MikamiUitOpen | 0:b6d17af0f47a | 68 | ud_->Set(frq_); // SeekBar の数値を NumericUpDown に表示する |
MikamiUitOpen | 0:b6d17af0f47a | 69 | dPhi_ = PI2_*frq_*TS_; |
MikamiUitOpen | 0:b6d17af0f47a | 70 | } |
MikamiUitOpen | 0:b6d17af0f47a | 71 | |
MikamiUitOpen | 0:b6d17af0f47a | 72 | if (ud_->Touched()) // NumericUpDown をタッチした場合の処理 |
MikamiUitOpen | 0:b6d17af0f47a | 73 | { |
MikamiUitOpen | 0:b6d17af0f47a | 74 | frq_ = ud_->Get(); |
MikamiUitOpen | 0:b6d17af0f47a | 75 | bar_->Draw(log10f(frq_)); // NumericUpDown の数値で SeekBar のツマミの位置を設定 |
MikamiUitOpen | 0:b6d17af0f47a | 76 | dPhi_ = PI2_*frq_*TS_; |
MikamiUitOpen | 0:b6d17af0f47a | 77 | } |
MikamiUitOpen | 0:b6d17af0f47a | 78 | |
MikamiUitOpen | 0:b6d17af0f47a | 79 | zmButton_->Touched(factor_); // ズームインとズームアウト |
MikamiUitOpen | 0:b6d17af0f47a | 80 | } |
MikamiUitOpen | 0:b6d17af0f47a | 81 | |
MikamiUitOpen | 0:b6d17af0f47a | 82 | // 入出力信号のデータを表示用バッファへ格納 |
MikamiUitOpen | 0:b6d17af0f47a | 83 | void Store(int16_t xn, int16_t yn, int n) |
MikamiUitOpen | 0:b6d17af0f47a | 84 | { |
MikamiUitOpen | 3:05c8d0ee9c37 | 85 | // N_DISP_BUF_ (= 1000) 個を越えたデータは格納しない |
MikamiUitOpen | 0:b6d17af0f47a | 86 | if (n >= N_DISP_BUF_) return; |
MikamiUitOpen | 0:b6d17af0f47a | 87 | |
MikamiUitOpen | 0:b6d17af0f47a | 88 | xnD_[n] = xn; |
MikamiUitOpen | 0:b6d17af0f47a | 89 | ynD_[n] = yn; |
MikamiUitOpen | 0:b6d17af0f47a | 90 | } |
MikamiUitOpen | 0:b6d17af0f47a | 91 | |
MikamiUitOpen | 3:05c8d0ee9c37 | 92 | // 入出力信号の波形の表示(トリガ条件を満足したところから表示する) |
MikamiUitOpen | 0:b6d17af0f47a | 93 | void Display() { waveDisp_->Execute(Trigger(xnD_, 1), factor_); } |
MikamiUitOpen | 0:b6d17af0f47a | 94 | |
MikamiUitOpen | 0:b6d17af0f47a | 95 | private: |
MikamiUitOpen | 0:b6d17af0f47a | 96 | static const float PI_ = 3.1415926536f; |
MikamiUitOpen | 0:b6d17af0f47a | 97 | static const float PI2_ = 2.0f*PI_; |
MikamiUitOpen | 0:b6d17af0f47a | 98 | static const int MIN_FRQ_ = 100; // 発生する周波数の最小値 |
MikamiUitOpen | 0:b6d17af0f47a | 99 | static const int MAX_FRQ_ = 10000; // 発生する周波数の最大値 |
MikamiUitOpen | 0:b6d17af0f47a | 100 | static const uint32_t BACK_COLOR_ = GuiBase::ENUM_BACK; |
MikamiUitOpen | 0:b6d17af0f47a | 101 | static const uint32_t AXIS_COLOR_ = 0xFFCCFFFF; |
MikamiUitOpen | 0:b6d17af0f47a | 102 | static const uint32_t LINE_COLOR1_ = LCD_COLOR_CYAN; |
MikamiUitOpen | 0:b6d17af0f47a | 103 | static const uint32_t LINE_COLOR2_ = LCD_COLOR_MAGENTA; |
MikamiUitOpen | 0:b6d17af0f47a | 104 | static const int N_DISP_BUF_ = 1000; // 波形表示用のバッファのサイズ |
MikamiUitOpen | 0:b6d17af0f47a | 105 | |
MikamiUitOpen | 0:b6d17af0f47a | 106 | const float TS_; // 標本化間隔 |
MikamiUitOpen | 0:b6d17af0f47a | 107 | |
MikamiUitOpen | 0:b6d17af0f47a | 108 | LCD_DISCO_F746NG &lcd_; |
MikamiUitOpen | 0:b6d17af0f47a | 109 | WaveformDisplay *waveDisp_; |
MikamiUitOpen | 1:d9fdd52ea43a | 110 | NumericUpDown *ud_; // 入力信号の周波数設定用(1 Hz 単位での設定用) |
MikamiUitOpen | 0:b6d17af0f47a | 111 | SeekBar *bar_; // 入力信号の周波数設定用(概略の設定用) |
MikamiUitOpen | 0:b6d17af0f47a | 112 | ZoomButton *zmButton_; // 波形表示:ズームイン/アウト用 |
MikamiUitOpen | 0:b6d17af0f47a | 113 | |
MikamiUitOpen | 0:b6d17af0f47a | 114 | Array<int16_t> xnD_; // 波形表示で使うバッファ(入力信号用) |
MikamiUitOpen | 0:b6d17af0f47a | 115 | Array<int16_t> ynD_; // 波形表示で使うバッファ(出力信号用) |
MikamiUitOpen | 0:b6d17af0f47a | 116 | int frq_; // 現在の入力信号の周波数,初期値は 1 kHz |
MikamiUitOpen | 0:b6d17af0f47a | 117 | float dPhi_, phi_; // 入力信号の生成で使う変数 |
MikamiUitOpen | 0:b6d17af0f47a | 118 | int factor_; // 波形表示の際の標本化間隔に対応するピクセル数 |
MikamiUitOpen | 0:b6d17af0f47a | 119 | }; |
MikamiUitOpen | 0:b6d17af0f47a | 120 | } |
MikamiUitOpen | 0:b6d17af0f47a | 121 | #endif // PANEL_MANIPULATOR_HPP |