San Yune / Mbed 2 deprecated Chapter003_TRobot

Dependencies:   F746_GUI Array_Matrix TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG SDFileSystem_Warning_Fixed FrequencyResponseDrawer F746_SAI_IO

Committer:
MikamiUitOpen
Date:
Mon Apr 25 12:50:20 2016 +0000
Revision:
3:cda40218256c
Parent:
2:2478e7a8e8d5
Child:
5:3e8ca1ed31a1
4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:04b43b777fae 1 //-----------------------------------------------------------
MikamiUitOpen 0:04b43b777fae 2 // 周波数が対数スケールの周波数特性を描画するクラス
MikamiUitOpen 0:04b43b777fae 3 // FrqRespDrawer class
MikamiUitOpen 0:04b43b777fae 4 //
MikamiUitOpen 2:2478e7a8e8d5 5 // 2016/04/25, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:04b43b777fae 6 //-----------------------------------------------------------
MikamiUitOpen 0:04b43b777fae 7
MikamiUitOpen 0:04b43b777fae 8 #include "FrquencyResponseDrawer.hpp"
MikamiUitOpen 0:04b43b777fae 9
MikamiUitOpen 0:04b43b777fae 10 namespace Mikami
MikamiUitOpen 0:04b43b777fae 11 {
MikamiUitOpen 0:04b43b777fae 12 // 目盛線の描画
MikamiUitOpen 0:04b43b777fae 13 void FrqRespDrawer::DrawAxis()
MikamiUitOpen 0:04b43b777fae 14 {
MikamiUitOpen 0:04b43b777fae 15 uint16_t height = DB1_*(MAX_DB_ - MIN_DB_);
MikamiUitOpen 0:04b43b777fae 16 int logMin = (int)floorf(log10f(MIN_));
MikamiUitOpen 0:04b43b777fae 17 int loop = (int)floorf(log10f(MAX_)) - logMin;
MikamiUitOpen 0:04b43b777fae 18
MikamiUitOpen 0:04b43b777fae 19 lcd_->SetTextColor(AXIS_COLOR_);
MikamiUitOpen 0:04b43b777fae 20 uint16_t y0 = ORGY_ - height;
MikamiUitOpen 0:04b43b777fae 21 lcd_->DrawVLine(X(MIN_), y0, height); // 最小値に対応する線
MikamiUitOpen 0:04b43b777fae 22
MikamiUitOpen 0:04b43b777fae 23 float du = powf(10.0, logMin); // 座標値の増分
MikamiUitOpen 0:04b43b777fae 24 float u1 = (floorf(MIN_/du) + 1.0f)*du; // 最小値に対応する線の次の座標値
MikamiUitOpen 0:04b43b777fae 25
MikamiUitOpen 0:04b43b777fae 26 for (int n=0; n<=loop; n++)
MikamiUitOpen 0:04b43b777fae 27 {
MikamiUitOpen 0:04b43b777fae 28 float uMax = (10.0f*du < MAX_) ? 10.0f*du : MAX_;
MikamiUitOpen 0:04b43b777fae 29 for (float u=u1; u<uMax*0.99f; u+=du)
MikamiUitOpen 0:04b43b777fae 30 lcd_->DrawVLine(X(u), y0, height);
MikamiUitOpen 0:04b43b777fae 31
MikamiUitOpen 0:04b43b777fae 32 du = uMax; // 値の増分を 10 倍する
MikamiUitOpen 0:04b43b777fae 33 u1 = du; // 次の for ループ の最初の値
MikamiUitOpen 0:04b43b777fae 34 }
MikamiUitOpen 0:04b43b777fae 35
MikamiUitOpen 0:04b43b777fae 36 lcd_->DrawVLine(X(MAX_), y0, height); // 最大値に対応する線
MikamiUitOpen 0:04b43b777fae 37
MikamiUitOpen 0:04b43b777fae 38 uint16_t width = X(MAX_) - X(MIN_);
MikamiUitOpen 2:2478e7a8e8d5 39 int count =Round((MAX_DB_ - MIN_DB_)/(Y_SPACE_/DB1_));
MikamiUitOpen 2:2478e7a8e8d5 40 for (int n=0; n<= count; n++)
MikamiUitOpen 2:2478e7a8e8d5 41 lcd_->DrawHLine(X(MIN_), ORGY_-Y_SPACE_*n, width);
MikamiUitOpen 0:04b43b777fae 42 }
MikamiUitOpen 0:04b43b777fae 43
MikamiUitOpen 0:04b43b777fae 44 // 横軸の目盛値の表示
MikamiUitOpen 0:04b43b777fae 45 void FrqRespDrawer::DrawNumericX(AxisX_Char xChar[], int nDisp, int offsetY,
MikamiUitOpen 0:04b43b777fae 46 string str, sFONT &fonts, uint32_t textColor)
MikamiUitOpen 0:04b43b777fae 47 {
MikamiUitOpen 0:04b43b777fae 48 for (int n=0; n<nDisp; n++)
MikamiUitOpen 0:04b43b777fae 49 Label frq(X(xChar[n].frq), ORGY_+offsetY,
MikamiUitOpen 0:04b43b777fae 50 xChar[n].str, Label::CENTER);
MikamiUitOpen 0:04b43b777fae 51 uint16_t x0 = ORGX_ + (uint16_t)(DEC_*log10f(MAX_/MIN_))/2;
MikamiUitOpen 0:04b43b777fae 52 Label l_frq(x0, ORGY_+20, str, Label::CENTER);
MikamiUitOpen 0:04b43b777fae 53 }
MikamiUitOpen 0:04b43b777fae 54
MikamiUitOpen 2:2478e7a8e8d5 55 // 縦軸の目盛値の表示
MikamiUitOpen 2:2478e7a8e8d5 56 void FrqRespDrawer::DrawNumericY(int offsetX, int offsetY, uint16_t d_dB,
MikamiUitOpen 2:2478e7a8e8d5 57 const char fmt[], sFONT &fonts,
MikamiUitOpen 0:04b43b777fae 58 uint32_t textColor, string str)
MikamiUitOpen 0:04b43b777fae 59 {
MikamiUitOpen 0:04b43b777fae 60 uint16_t x0 = ORGX_ + offsetX;
MikamiUitOpen 0:04b43b777fae 61 uint16_t y0 = ORGY_ + offsetY;
MikamiUitOpen 2:2478e7a8e8d5 62 int count = Round((MAX_DB_ - MIN_DB_)/d_dB);
MikamiUitOpen 2:2478e7a8e8d5 63
MikamiUitOpen 2:2478e7a8e8d5 64 for (int n=0; n<=count; n++)
MikamiUitOpen 0:04b43b777fae 65 NumericLabel<int> num(x0, y0-n*d_dB*DB1_,
MikamiUitOpen 0:04b43b777fae 66 fmt, (int)(MIN_DB_+d_dB*n));
MikamiUitOpen 2:2478e7a8e8d5 67 Label l_dB(x0, y0-count*d_dB*DB1_-12, str);
MikamiUitOpen 0:04b43b777fae 68 }
MikamiUitOpen 0:04b43b777fae 69
MikamiUitOpen 0:04b43b777fae 70 // 周波数特性のグラフの描画
MikamiUitOpen 3:cda40218256c 71 void FrqRespDrawer::DrawGraph(FrequencyResponse *frqResp, uint32_t color)
MikamiUitOpen 0:04b43b777fae 72 {
MikamiUitOpen 0:04b43b777fae 73 lcd_->SetTextColor(color);
MikamiUitOpen 0:04b43b777fae 74 uint16_t width = X(MAX_) - X(MIN_);
MikamiUitOpen 0:04b43b777fae 75 uint16_t x1 = 0;
MikamiUitOpen 0:04b43b777fae 76 uint16_t y1 = 0;
MikamiUitOpen 0:04b43b777fae 77 float pi2FsM = -6.283185f/FS_; // -2*PI*Ts
MikamiUitOpen 0:04b43b777fae 78 for (int n=0; n<=width; n++)
MikamiUitOpen 0:04b43b777fae 79 {
MikamiUitOpen 0:04b43b777fae 80 float frq = PosToFrq(n+ORGX_);
MikamiUitOpen 0:04b43b777fae 81 uint16_t x2 = X(frq);
MikamiUitOpen 3:cda40218256c 82 float absHz = frqResp->AbsH_z(exp(Complex(0, pi2FsM*frq)));
MikamiUitOpen 0:04b43b777fae 83 float dB = (absHz > 0.001f) ? 20.0f*log10f(absHz) : MIN_DB_;
MikamiUitOpen 0:04b43b777fae 84 uint16_t y2 = ORGY_ - Round((dB - MIN_DB_)*DB1_);
MikamiUitOpen 0:04b43b777fae 85 if (y2 > ORGY_) y2 = ORGY_;
MikamiUitOpen 0:04b43b777fae 86
MikamiUitOpen 0:04b43b777fae 87 if (n != 0) lcd_->DrawLine(x1, y1, x2, y2);
MikamiUitOpen 0:04b43b777fae 88
MikamiUitOpen 0:04b43b777fae 89 x1 = x2;
MikamiUitOpen 0:04b43b777fae 90 y1 = y2;
MikamiUitOpen 0:04b43b777fae 91 }
MikamiUitOpen 0:04b43b777fae 92 lcd_->SetTextColor(AXIS_COLOR_);
MikamiUitOpen 0:04b43b777fae 93 lcd_->DrawHLine(X(MIN_), ORGY_, width);
MikamiUitOpen 0:04b43b777fae 94 }
MikamiUitOpen 0:04b43b777fae 95
MikamiUitOpen 0:04b43b777fae 96 // 消去
MikamiUitOpen 0:04b43b777fae 97 void FrqRespDrawer::Erase()
MikamiUitOpen 0:04b43b777fae 98 {
MikamiUitOpen 0:04b43b777fae 99 lcd_->SetTextColor(BACK_COLOR_);
MikamiUitOpen 0:04b43b777fae 100 uint16_t height = DB1_*(MAX_DB_ - MIN_DB_);
MikamiUitOpen 0:04b43b777fae 101 lcd_->FillRect(ORGX_, ORGY_- height, X(MAX_)-X(MIN_)+1, height+1);
MikamiUitOpen 0:04b43b777fae 102 }
MikamiUitOpen 0:04b43b777fae 103 }