CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラム.1次IIRフィルタの係数をターミナルから変更できる. http://seminar.cqpub.co.jp/ccm/ES18-0020

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Revision:
0:47718d3154d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MyFiles/LcdPanelFrq.hpp	Mon Oct 09 02:36:11 2017 +0000
@@ -0,0 +1,119 @@
+//-----------------------------------------------------------
+//  ディジタルフィルタ実験のためのプラットフォームの
+//  LCD パネル表示と入力信号の周波数設定で使う
+//
+//  2017/08/21, Copyright (c) 2017 MIKAMI, Naoki
+//-----------------------------------------------------------
+
+#ifndef PANEL_MANIPULATOR_HPP
+#define PANEL_MANIPULATOR_HPP
+
+#include "F746_GUI.hpp"
+#include "NumericUpDown.hpp"
+#include "Zoom.hpp"
+#include "WaveformDisplay.hpp"
+#include "Trigger.hpp"
+
+namespace Mikami
+{
+    class LcdPanel
+    {
+    public:
+        //  ts  : 標本化間隔(単位:μs)
+        LcdPanel(float ts)
+            : TS_(ts), lcd_(GuiBase::GetLcd()),
+              xnD_(N_DISP_BUF_), ynD_(N_DISP_BUF_), frq_(1000),
+              dPhi_(PI2_*frq_*TS_), phi_(0), factor_(1)
+        {
+            Label title(240, 10, "Digital Filter LAB", Label::CENTER, Font16);
+
+            const uint16_t Y0 = 170;
+            // 凡例
+            lcd_.SetTextColor(LINE_COLOR1_);
+            lcd_.DrawHLine(360, Y0+6, 50);
+            Label label1(420, Y0, "Input");
+            lcd_.SetTextColor(LINE_COLOR2_);
+            lcd_.DrawHLine(360, Y0+26, 50);
+            Label label2(420, Y0+20, "Output");
+
+            waveDisp_ = new WaveformDisplay(lcd_, 30, 90, xnD_, ynD_, 400, 8,
+                                            AXIS_COLOR_,
+                                            LINE_COLOR1_, LINE_COLOR2_,
+                                            BACK_COLOR_);
+
+            // GUI 設定
+            ud_ = new NumericUpDown(4, 0, 271, frq_, 9999, 100, "Hz");
+            bar_ = new SeekBar(230, 250, 230,
+                               log10f(MIN_FRQ_), log10f(MAX_FRQ_), log10f(1000),
+                               "0.1", "1.0", "10.0");
+            // 時間軸の拡大率は 8 倍まで
+            zmButton_ = new ZoomButton(240, Y0, 40, 30, 8);
+        }
+
+        // 正弦波の発生で使う値の更新し,取得する
+        float GetPhi()
+        {
+            if ((phi_ += dPhi_) > PI2_) phi_ -= PI2_;
+            return phi_;
+        }
+
+        // 周波数設定の更新とズームイン/アウト・ボタンの処理
+        void Update()
+        {        
+            if (bar_->Slide())  // SeekBar をスライドした場合の処理
+            {
+                frq_ = (int)(powf(10, bar_->GetValue())+0.5f);
+                if (frq_ >= MAX_FRQ_) frq_ = MAX_FRQ_ - 1;
+                ud_->Set(frq_); // SeekBar の数値を NumericUpDown に表示する
+                dPhi_ = PI2_*frq_*TS_;
+            }
+
+            if (ud_->Touched())     // NumericUpDown をタッチした場合の処理
+            {
+                frq_ = ud_->Get();
+                bar_->Draw(log10f(frq_));  // NumericUpDown の数値で SeekBar のツマミの位置を設定
+                dPhi_ = PI2_*frq_*TS_;
+            }
+
+            zmButton_->Touched(factor_);   // ズームインとズームアウト
+        }
+
+        // 入出力信号のデータを表示用バッファへ格納
+        void Store(int16_t xn, int16_t yn, int n)
+        {
+            if (n >= N_DISP_BUF_) return;
+
+            xnD_[n] = xn;
+            ynD_[n] = yn;
+        }
+        
+        // 入出力信号の波形の表示
+        void Display() { waveDisp_->Execute(Trigger(xnD_, 1), factor_); }
+
+    private:
+        static const float PI_ = 3.1415926536f;
+        static const float PI2_ = 2.0f*PI_;
+        static const int MIN_FRQ_ = 100;        // 発生する周波数の最小値
+        static const int MAX_FRQ_ = 10000;      // 発生する周波数の最大値
+        static const uint32_t BACK_COLOR_ = GuiBase::ENUM_BACK;
+        static const uint32_t AXIS_COLOR_ = 0xFFCCFFFF;
+        static const uint32_t LINE_COLOR1_ = LCD_COLOR_CYAN;
+        static const uint32_t LINE_COLOR2_ = LCD_COLOR_MAGENTA;
+        static const int N_DISP_BUF_ = 1000;    // 波形表示用のバッファのサイズ
+
+        const float TS_;    // 標本化間隔
+
+        LCD_DISCO_F746NG &lcd_;
+        WaveformDisplay *waveDisp_;
+        NumericUpDown *ud_;            // 入力信号の周波数設定用(1 Hz 単位での設定用)
+        SeekBar *bar_;          // 入力信号の周波数設定用(概略の設定用)
+        ZoomButton *zmButton_;  // 波形表示:ズームイン/アウト用
+
+        Array<int16_t> xnD_;    // 波形表示で使うバッファ(入力信号用)
+        Array<int16_t> ynD_;    // 波形表示で使うバッファ(出力信号用)
+        int frq_;               // 現在の入力信号の周波数,初期値は 1 kHz
+        float dPhi_, phi_;      // 入力信号の生成で使う変数
+        int factor_;            // 波形表示の際の標本化間隔に対応するピクセル数
+    };
+}
+#endif  // PANEL_MANIPULATOR_HPP