![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: main.cpp
- Revision:
- 0:e2c6c8630aab
- Child:
- 1:04ea670bd41e
diff -r 000000000000 -r e2c6c8630aab main.cpp --- /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(); // 次のフレームの入力準備 + } + } +}