Demo program of SAI_IO class for audio signal input and output. DISCO-F746 搭載の CODEC (WM8994) を使ってオーディオ信号の入出力を行うための SAI_IO クラスの使用例.

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_SAI_IO LCD_DISCO_F746NG TS_DISCO_F746NG mbed

Revision:
4:0beea5d9a205
Parent:
0:089c5e022aa8
Child:
8:6cb2c40946c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WaveformDisplay.hpp	Sat Jul 23 06:14:23 2016 +0000
@@ -0,0 +1,91 @@
+//-----------------------------------------------------------
+//  Class for waveform display
+//
+//  2016/05/03, Copyright (c) 2016 MIKAMI, Naoki
+//-----------------------------------------------------------
+
+#ifndef F746_WAVEFORM_DISPLAY_HPP
+#define F746_WAVEFORM_DISPLAY_HPP
+
+#include "mbed.h"
+
+namespace Mikami
+{
+    class WaveformDisplay
+    {
+    public:
+        WaveformDisplay(LCD_DISCO_F746NG *lcd,
+                        uint16_t x0, uint16_t y0, int nData,
+                        uint16_t rShift,
+                        uint32_t axisColor, uint32_t lineColor,
+                        uint32_t backColor)
+            : X0_(x0), Y0_(y0), N_DATA_(nData), R_SHIFT_(rShift),
+              AXIS_COLOR_(axisColor), LINE_COLOR_(lineColor),
+              BACK_COLOR_(backColor), lcd_(lcd) { Axis(); }
+        
+        void Execute(const int16_t xn[])
+        {
+            static const uint16_t LIMIT1 = Y0_ + LIMIT2_;
+            static const uint16_t LIMIT2 = Y0_ - LIMIT2_;
+            Axis();
+            lcd_->SetTextColor(LINE_COLOR_);
+            uint16_t x1 = X0_;
+            uint16_t y1 = Clip(xn[0]);
+            for (int n=1; n<N_DATA_; n++)
+            {
+                uint16_t x2 = X0_ + n;
+                uint16_t y2 = Clip(xn[n]);
+                if ( ((y2 == LIMIT1) && (y1 == LIMIT1)) ||
+                     ((y2 == LIMIT2) && (y1 == LIMIT2)) )
+                {   // Out of displaying boundaries
+                    lcd_->SetTextColor(LCD_COLOR_RED);
+                    lcd_->DrawHLine(x1, y1, 1);
+                    lcd_->SetTextColor(LINE_COLOR_);
+                }
+                else
+                    lcd_->DrawLine(x1, y1, x2, y2);
+                if ((y1 == LIMIT1) || (y1 == LIMIT2))
+                    lcd_->DrawPixel(x1, y1, LCD_COLOR_RED);
+                x1 = x2;
+                y1 = y2;
+            }
+            lcd_->SetTextColor(BACK_COLOR_);
+        }
+        
+    private:
+        const uint16_t X0_;
+        const uint16_t Y0_;
+        const int N_DATA_;
+        const uint16_t R_SHIFT_;
+        const uint32_t AXIS_COLOR_;
+        const uint32_t LINE_COLOR_;
+        const uint32_t BACK_COLOR_;
+        static const int LIMIT_ = 32;
+        static const int LIMIT2_ = LIMIT_ + 1;
+        
+        LCD_DISCO_F746NG *lcd_;
+        
+        // Clipping
+        uint16_t Clip(int16_t xn)
+        {
+            int16_t x = xn >> R_SHIFT_;
+            if (x >  LIMIT_ ) x =  LIMIT2_;
+            if (x < -LIMIT_ ) x = -LIMIT2_ ;
+            return Y0_ - x;
+        }
+        
+        void Axis()
+        {
+            lcd_->SetTextColor(BACK_COLOR_);
+            lcd_->FillRect(X0_, Y0_-LIMIT2_, N_DATA_, LIMIT2_*2+1);
+
+            lcd_->SetTextColor(AXIS_COLOR_);
+            lcd_->DrawLine(X0_-5, Y0_, X0_+N_DATA_+5, Y0_);
+        }        
+
+        // disallow copy constructor and assignment operator
+        WaveformDisplay(const WaveformDisplay& );
+        WaveformDisplay& operator=(const WaveformDisplay& );
+    };
+}
+#endif  // F746_WAVEFORM_DISPLAY_HPP