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

Committer:
MikamiUitOpen
Date:
Fri Mar 17 01:55:12 2017 +0000
Revision:
4:bf927b50098b
Parent:
3:b16250c9593c
Child:
5:92bb7f2bf714
5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:e2c6c8630aab 1 //--------------------------------------------------------------
MikamiUitOpen 0:e2c6c8630aab 2 // MEMS マイクまたはラインから CODEC を使って入力した信号の波形の表示
MikamiUitOpen 0:e2c6c8630aab 3 // 標本化周波数: 16 kHz
MikamiUitOpen 0:e2c6c8630aab 4 //
MikamiUitOpen 2:afff5ec35233 5 // mbed ライブラリはリビジョン 131 またはそれ以前のものを使うこと
MikamiUitOpen 2:afff5ec35233 6 //
MikamiUitOpen 4:bf927b50098b 7 // 2017/03/17, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:e2c6c8630aab 8 //--------------------------------------------------------------
MikamiUitOpen 0:e2c6c8630aab 9
MikamiUitOpen 0:e2c6c8630aab 10 #include "F746_GUI.hpp"
MikamiUitOpen 0:e2c6c8630aab 11 #include "SAI_InOut.hpp"
MikamiUitOpen 0:e2c6c8630aab 12 #include "WaveformDisplay.hpp"
MikamiUitOpen 0:e2c6c8630aab 13 #include "Trigger.hpp"
MikamiUitOpen 0:e2c6c8630aab 14
MikamiUitOpen 0:e2c6c8630aab 15 int main()
MikamiUitOpen 0:e2c6c8630aab 16 {
MikamiUitOpen 0:e2c6c8630aab 17 const uint32_t BACK_COLOR = GuiBase::ENUM_BACK;
MikamiUitOpen 0:e2c6c8630aab 18 const uint32_t AXIS_COLOR = 0xFFCCFFFF;
MikamiUitOpen 0:e2c6c8630aab 19 const uint32_t LINE_COLOR = LCD_COLOR_CYAN;
MikamiUitOpen 0:e2c6c8630aab 20
MikamiUitOpen 2:afff5ec35233 21 const uint32_t N_DATA_SAI = 600; // SAI で使うデータ数
MikamiUitOpen 2:afff5ec35233 22 const uint32_t N_DATA = N_DATA_SAI*2/3; // 表示するデータ数
MikamiUitOpen 4:bf927b50098b 23 SaiIO mySai(SaiIO::INPUT, N_DATA_SAI, AUDIO_FREQUENCY_16K,
MikamiUitOpen 0:e2c6c8630aab 24 INPUT_DEVICE_DIGITAL_MICROPHONE_2);
MikamiUitOpen 2:afff5ec35233 25
MikamiUitOpen 4:bf927b50098b 26 LCD_DISCO_F746NG &lcd = GuiBase::GetLcd();
MikamiUitOpen 4:bf927b50098b 27 lcd.Clear(BACK_COLOR);
MikamiUitOpen 0:e2c6c8630aab 28
MikamiUitOpen 3:b16250c9593c 29 Label labelTitle(240, 10, "Simplified Oscilloscope",
MikamiUitOpen 0:e2c6c8630aab 30 Label::CENTER, Font16);
MikamiUitOpen 2:afff5ec35233 31 Label labelTrigg(20, 250);
MikamiUitOpen 0:e2c6c8630aab 32
MikamiUitOpen 0:e2c6c8630aab 33 const uint16_t B_LEFT = 240;
MikamiUitOpen 0:e2c6c8630aab 34 const uint16_t B_TOP = 235;
MikamiUitOpen 0:e2c6c8630aab 35 const uint16_t B_WIDTH = 55;
MikamiUitOpen 0:e2c6c8630aab 36 const uint16_t B_HEIGHT = 35;
MikamiUitOpen 0:e2c6c8630aab 37
MikamiUitOpen 0:e2c6c8630aab 38 ButtonGroup inputSw(B_LEFT, B_TOP, B_WIDTH, B_HEIGHT,
MikamiUitOpen 0:e2c6c8630aab 39 2, (string[]){"MIC", "LINE"}, 0, 0, 2, 0);
MikamiUitOpen 0:e2c6c8630aab 40
MikamiUitOpen 0:e2c6c8630aab 41 ButtonGroup runStop(B_LEFT+B_WIDTH*2+10, B_TOP, B_WIDTH, B_HEIGHT,
MikamiUitOpen 0:e2c6c8630aab 42 2, (string[]){"RUN", "STOP"}, 0, 0, 2, 0);
MikamiUitOpen 0:e2c6c8630aab 43
MikamiUitOpen 0:e2c6c8630aab 44 const int X_WAV = 30; // x 方向の原点
MikamiUitOpen 0:e2c6c8630aab 45 const int Y_WAV = 100; // y 方向の原点(上部に表示される波形)
MikamiUitOpen 0:e2c6c8630aab 46 Array<int16_t> xnL(N_DATA), xnR(N_DATA); // 表示で使うデータ
MikamiUitOpen 0:e2c6c8630aab 47 WaveformDisplay waveDispL(lcd, X_WAV, Y_WAV, xnL, 7,
MikamiUitOpen 0:e2c6c8630aab 48 AXIS_COLOR, LINE_COLOR, BACK_COLOR);
MikamiUitOpen 0:e2c6c8630aab 49 WaveformDisplay waveDispR(lcd, X_WAV, Y_WAV+80, xnR, 7,
MikamiUitOpen 0:e2c6c8630aab 50 AXIS_COLOR, LINE_COLOR, BACK_COLOR);
MikamiUitOpen 0:e2c6c8630aab 51 Label labelL(445, Y_WAV- 8, "L", Label::LEFT, Font16);
MikamiUitOpen 0:e2c6c8630aab 52 Label labelR(445, Y_WAV+72, "R", Label::LEFT, Font16);
MikamiUitOpen 0:e2c6c8630aab 53
MikamiUitOpen 0:e2c6c8630aab 54 Array<int16_t> snL(N_DATA_SAI), snR(N_DATA_SAI);
MikamiUitOpen 0:e2c6c8630aab 55 Trigger myTrigger(snL, snR, xnL, xnR, 64);
MikamiUitOpen 0:e2c6c8630aab 56 int inSelect = 0; // 初期値:入力デバイスをマイクにする
MikamiUitOpen 0:e2c6c8630aab 57
MikamiUitOpen 0:e2c6c8630aab 58 mySai.RecordIn(); // 入力開始
MikamiUitOpen 0:e2c6c8630aab 59 bool run = true; // 入力実行中
MikamiUitOpen 0:e2c6c8630aab 60
MikamiUitOpen 0:e2c6c8630aab 61 while (true)
MikamiUitOpen 0:e2c6c8630aab 62 {
MikamiUitOpen 0:e2c6c8630aab 63 int sw = 0;
MikamiUitOpen 0:e2c6c8630aab 64 if (runStop.GetTouchedNumber(sw))
MikamiUitOpen 0:e2c6c8630aab 65 {
MikamiUitOpen 0:e2c6c8630aab 66 bool on = (sw == 0) ? true : false;
MikamiUitOpen 0:e2c6c8630aab 67 if (on && !run) mySai.ResumeIn(); // 入力再開
MikamiUitOpen 0:e2c6c8630aab 68 if (!on && run) mySai.PauseIn(); // 入力中断
MikamiUitOpen 0:e2c6c8630aab 69 run = on;
MikamiUitOpen 0:e2c6c8630aab 70 }
MikamiUitOpen 0:e2c6c8630aab 71
MikamiUitOpen 0:e2c6c8630aab 72 int swNow;
MikamiUitOpen 0:e2c6c8630aab 73 if (inputSw.GetTouchedNumber(swNow) && (swNow != inSelect))
MikamiUitOpen 0:e2c6c8630aab 74 {
MikamiUitOpen 2:afff5ec35233 75 mySai.SwitchInputDevice(swNow); // 入力デバイスの設定
MikamiUitOpen 0:e2c6c8630aab 76 inSelect = swNow;
MikamiUitOpen 0:e2c6c8630aab 77 }
MikamiUitOpen 0:e2c6c8630aab 78
MikamiUitOpen 0:e2c6c8630aab 79 if (mySai.IsCaptured()) // 入力データがそろってから波形を表示する
MikamiUitOpen 0:e2c6c8630aab 80 {
MikamiUitOpen 0:e2c6c8630aab 81 for (int n=0; n<N_DATA_SAI; n++)
MikamiUitOpen 0:e2c6c8630aab 82 mySai.Input(snL[n], snR[n]);
MikamiUitOpen 0:e2c6c8630aab 83
MikamiUitOpen 0:e2c6c8630aab 84 bool trigg = myTrigger.Execute(); // トリガと同等の操作
MikamiUitOpen 2:afff5ec35233 85
MikamiUitOpen 0:e2c6c8630aab 86 if (trigg) labelTrigg.Draw("Triggered");
MikamiUitOpen 0:e2c6c8630aab 87 else labelTrigg.Draw("Not Triggered");
MikamiUitOpen 2:afff5ec35233 88
MikamiUitOpen 0:e2c6c8630aab 89 waveDispL.Execute(); // 左チャンネルの波形表示
MikamiUitOpen 0:e2c6c8630aab 90 waveDispR.Execute(); // 右チャンネルの波形表示
MikamiUitOpen 0:e2c6c8630aab 91 }
MikamiUitOpen 0:e2c6c8630aab 92 }
MikamiUitOpen 0:e2c6c8630aab 93 }