DISCO-F746NGのAudioInからの音声信号をLCDに波形として出力する、簡易なオシロスコープです。 This program is easy oscilloscope. The program draws waveform of signals from AudioIn on DISCO-F746NG.
Dependencies: BSP_DISCO_F746NG_patch_fixed LCD_DISCO_F746NG mbed
Diff: main.cpp
- Revision:
- 0:36a62c23e60c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Dec 26 14:51:48 2015 +0000 @@ -0,0 +1,77 @@ +#include "main.h" + +LCD_DISCO_F746NG lcd; + +int16_t audio_in_buffer[BufferSize]; +__IO bool audio_in_buffer_captured = false; +__IO int32_t audio_in_buffer_offset = 0; +__IO int32_t audio_in_buffer_length = 0; + +void init_audio_in() +{ + if (BSP_AUDIO_IN_Init(INPUT_DEVICE_INPUT_LINE_1, AudioInVolume, SamplingFreq) == AUDIO_ERROR) + error_trap(); + + NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ, (uint32_t)&AUDIO_IN_SAIx_DMAx_IRQHandler); +} + +void record_audio_in() +{ + if (BSP_AUDIO_IN_Record((uint16_t*)&audio_in_buffer[0], BufferByteSize / 2) == AUDIO_ERROR) + error_trap(); +} + + +int main() +{ + char strbuf[64]; + uint16_t width, height, height_2, graph_height; + double y_factor; + + lcd.Clear(LCD_COLOR_BLACK); + lcd.SetBackColor(LCD_COLOR_BLACK); + lcd.SetTextColor(LCD_COLOR_WHITE); + lcd.SetFont(&Font12); + sprintf(strbuf, "SamplingFreq: %d Hz", SamplingFreq); + lcd.DisplayStringAt(0, 0, (uint8_t *)strbuf, LEFT_MODE); + + width = lcd.GetXSize() - 1; + height = lcd.GetYSize() - 1; + graph_height = height - LINE(1); + height_2 = graph_height / 2; + y_factor = (graph_height * 0.5 * AudioInGraphYFactor) / 32768.0; + + init_audio_in(); + record_audio_in(); + + while(1) { + if (audio_in_buffer_captured) { + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(0, LINE(1), width, graph_height); + lcd.SetTextColor(LCD_COLOR_WHITE); + + for (int32_t i = audio_in_buffer_offset, j = 0; j < audio_in_buffer_length / 2 - 1 && j < width - 1; j++) { + uint16_t k = (uint16_t)j; + int16_t y1 = (int16_t)(audio_in_buffer[i + 0] * y_factor); + int16_t y2 = (int16_t)(audio_in_buffer[i + 4] * y_factor); + + if (y1 > height_2) + y1 = height_2; + else if (y1 < -height_2) + y1 = -height_2; + + if (y2 > height_2) + y2 = height_2; + else if (y2 < -height_2) + y2 = -height_2; + + lcd.DrawLine(k, (uint16_t)(height_2 + y1 + LINE(1)), k + 1, (uint16_t)(height_2 + y2 + LINE(1))); + + i += 4; + } + audio_in_buffer_captured = false; + } + + wait_ms(AudioInLCDInterval); + } +} \ No newline at end of file