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