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
main.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2017-01-16
- Revision:
- 3:b16250c9593c
- Parent:
- 2:afff5ec35233
- Child:
- 4:bf927b50098b
File content as of revision 3:b16250c9593c:
//-------------------------------------------------------------- // MEMS マイクまたはラインから CODEC を使って入力した信号の波形の表示 // 標本化周波数: 16 kHz // // mbed ライブラリはリビジョン 131 またはそれ以前のものを使うこと // // 2017/01/15, Copyright (c) 2017 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 = N_DATA_SAI*2/3; // 表示するデータ数 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(); // 次のフレームの入力準備 } } }