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:
Mon Mar 12 05:27:19 2018 +0000
Revision:
5:92bb7f2bf714
Parent:
4:bf927b50098b
6

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