Waveform display for input signal using SAI from MEMS microphone or line. MEMS マイクまたはラインから SAI により入力した信号の波形を表示する.

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_SAI_IO LCD_DISCO_F746NG TS_DISCO_F746NG mbed

Revision:
0:e2c6c8630aab
Child:
1:04ea670bd41e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jul 24 11:33:55 2016 +0000
@@ -0,0 +1,93 @@
+//--------------------------------------------------------------
+//  MEMS マイクまたはラインから CODEC を使って入力した信号の波形の表示
+//      標本化周波数: 16 kHz
+//
+//  2016/07/23, Copyright (c) 2016 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#include "F746_GUI.hpp"
+#include "SAI_InOut.hpp"
+#include "WaveformDisplay.hpp"
+#include "Trigger.hpp"
+
+int main()
+{
+    const uint32_t BACK_COLOR = GuiBase::ENUM_BACK;
+    const uint32_t AXIS_COLOR = 0xFFCCFFFF;
+    const uint32_t LINE_COLOR = LCD_COLOR_CYAN;
+
+    const uint32_t N_DATA_SAI = 600;    // SAI で使うデータ数
+    const uint32_t N_DATA = 400;        // 表示するデータ数
+    SaiIO mySai(SaiIO::INPUT, N_DATA_SAI, I2S_AUDIOFREQ_16K,
+                INPUT_DEVICE_DIGITAL_MICROPHONE_2);
+    
+    LCD_DISCO_F746NG *lcd = GuiBase::GetLcdPtr();
+    lcd->Clear(BACK_COLOR);
+
+    Label labelTitle(240, 10, "Simplified Oscilloscope",
+                     Label::CENTER, Font16);
+    Label labelTrigg(20, 250, "");
+
+    const uint16_t B_LEFT = 240;
+    const uint16_t B_TOP = 235;
+    const uint16_t B_WIDTH = 55;
+    const uint16_t B_HEIGHT = 35;
+
+    ButtonGroup inputSw(B_LEFT, B_TOP, B_WIDTH, B_HEIGHT,
+                        2, (string[]){"MIC", "LINE"}, 0, 0, 2, 0);
+
+    ButtonGroup runStop(B_LEFT+B_WIDTH*2+10, B_TOP, B_WIDTH, B_HEIGHT,
+                        2, (string[]){"RUN", "STOP"}, 0, 0, 2, 0);
+
+    const int X_WAV = 30;   // x 方向の原点
+    const int Y_WAV = 100;  // y 方向の原点(上部に表示される波形)
+    Array<int16_t> xnL(N_DATA), xnR(N_DATA);    // 表示で使うデータ
+    WaveformDisplay waveDispL(lcd, X_WAV, Y_WAV, xnL, 7,
+                              AXIS_COLOR, LINE_COLOR, BACK_COLOR);
+    WaveformDisplay waveDispR(lcd, X_WAV, Y_WAV+80, xnR, 7,
+                              AXIS_COLOR, LINE_COLOR, BACK_COLOR);
+    Label labelL(445, Y_WAV- 8, "L", Label::LEFT, Font16);
+    Label labelR(445, Y_WAV+72, "R", Label::LEFT, Font16);
+
+    Array<int16_t> snL(N_DATA_SAI), snR(N_DATA_SAI);
+    Trigger myTrigger(snL, snR, xnL, xnR, 64);
+    int inSelect = 0;   // 初期値:入力デバイスをマイクにする
+
+    mySai.RecordIn();   // 入力開始
+    bool run = true;    // 入力実行中
+
+    while (true)
+    {
+        int sw = 0;
+        if (runStop.GetTouchedNumber(sw))
+        {
+            bool on = (sw == 0) ? true : false;
+            if (on && !run) mySai.ResumeIn();   // 入力再開
+            if (!on && run) mySai.PauseIn();    // 入力中断
+            run = on;
+        }
+
+        int swNow;
+        if (inputSw.GetTouchedNumber(swNow) && (swNow != inSelect))
+        {
+            mySai.SwitchInputDevice(swNow); // 入力デバイスの設置
+            inSelect = swNow;
+        }
+
+        if (mySai.IsCaptured())     // 入力データがそろってから波形を表示する
+        {
+            for (int n=0; n<N_DATA_SAI; n++)
+                mySai.Input(snL[n], snR[n]);
+
+            bool trigg = myTrigger.Execute();   // トリガと同等の操作
+            
+            if (trigg) labelTrigg.Draw("Triggered");
+            else       labelTrigg.Draw("Not Triggered");
+            
+            waveDispL.Execute();    // 左チャンネルの波形表示
+            waveDispR.Execute();    // 右チャンネルの波形表示
+
+            mySai.ResetCaptured();  // 次のフレームの入力準備
+        }    
+    }
+}