GUI parts for DISCO-F746NG. GuiBase, Button, ButtonGroup, ResetButton, Label, BlinkLabel, NumericLabel, SeekBar, SeekbarGroup, NumericUpDown

Dependencies:   Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Dependents:   F746_AudioOutQSPI F746_AudioPlayerSD DISCO-F746NG_test001 F746_SD_WavPlayer ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers NumericUpDown.cpp Source File

NumericUpDown.cpp

00001 //-----------------------------------------------------------
00002 //  NumericUpDown class
00003 //      指定された桁を up/down する GUI 部品
00004 //      6 桁まで可能
00005 //
00006 //  2017/08/21, Copyright (c) 2017 MIKAMI, Naoki
00007 //-----------------------------------------------------------
00008 
00009 #include "NumericUpDown.hpp"
00010 
00011 namespace Mikami
00012 {
00013     // digit    表示する桁数
00014     // initVal  最初に表示する数値
00015     NumericUpDown::NumericUpDown(uint16_t digit, uint16_t x0, uint16_t y0,
00016                                  uint32_t initVal, uint32_t max, uint32_t min,
00017                                  string unit, float delay)
00018         : DIGIT_(digit), X0_(x0), Y0_(y0), MAX_(max), MIN_(min),
00019           POW10_(6, (uint32_t []){1, 10, 100, 1000, 10000, 10000}),
00020           numUd_(-1), value_(initVal),
00021           delay_(delay), labels_(digit), lcd_(GuiBase::GetLcd())
00022     {
00023         MBED_ASSERT(DIGIT_ <= 6);   // 6 桁まで
00024         sprintf(fmt_, "%%""0%1dd", DIGIT_);
00025         for (int n=0; n<DIGIT_; n++)
00026             labels_[n] = new Label(
00027                 X0_+10+n*XW_, Y0_-46, "", Label::LEFT, Font16);
00028         Set(initVal);       // 初期値として表示
00029         Label lbUnit(X0_+0+DIGIT_*XW_, Y0_-46, unit, Label::LEFT, Font16);
00030         Array<string> nonString(DIGIT_*2, "");
00031         ud_ = new ButtonGroup(X0_, Y0_-81, 30, 30, DIGIT_*2, nonString,
00032                               XW_-30, 22, DIGIT_);
00033         for (int n=0; n<DIGIT_*2; n++) UpDownSymbol(X0_, Y0_, n);
00034     }
00035 
00036     // Up, Down をタッチした場合は対応する数値を +1 または -1 する
00037     bool NumericUpDown::Touched()
00038     {
00039         if (!delay_.IsEnabled()) return false;
00040         int num;
00041         if (!ud_->GetTouchedNumber(num)) return false;
00042 
00043         // タッチ後一定の時間が経過してから,再びタッチの検出を有効にするため
00044         delay_.Disable();
00045 
00046         // 三角を再描画
00047         UpDownSymbol(X0_, Y0_, num);
00048         if (numUd_ != -1) UpDownSymbol(X0_, Y0_, numUd_);
00049         numUd_ = num;
00050 
00051         int index = num % DIGIT_;
00052         if (num < DIGIT_) value_ += POW10_[DIGIT_-index-1];
00053         else
00054             if (index != 0)
00055                 value_ -= POW10_[DIGIT_-index-1];
00056             else
00057                 if (value_ >= POW10_[DIGIT_-1])
00058                     value_ -= POW10_[DIGIT_-index-1];
00059         Set(value_);
00060         return true;
00061     }
00062 
00063     // 引数の数値を Label に表示する
00064     void NumericUpDown::Set(uint32_t frq)
00065     {
00066         if (frq > MAX_) frq = MAX_;
00067         if (frq < MIN_) frq = MIN_;
00068         char frqCh[7];
00069         sprintf(frqCh, fmt_, frq);
00070 
00071         for (int n=0; n<DIGIT_; n++)
00072             labels_[n]->Draw((string)""+frqCh[n]);
00073         value_ = frq;
00074     }
00075 
00076     // 数値の up, down に使う三角形の描画
00077     void NumericUpDown::UpDownSymbol(uint16_t x, uint16_t y, int k)
00078     {
00079         lcd_.SetTextColor(GuiBase::ENUM_TEXT);
00080         Point *pt = k < DIGIT_ ? ptU_ : ptD_;
00081         int16_t y0 = k < DIGIT_ ? y - 25 : y + 31;
00082 
00083         Point tri[3];
00084         for (int n=0; n<3; n++)
00085         {
00086             tri[n].X = pt[n].X + x + XW_*(k % DIGIT_) + 15;
00087             tri[n].Y = pt[n].Y + y0 - 46;
00088         }
00089         lcd_.FillPolygon(tri, 3);
00090     }
00091     
00092     Point NumericUpDown::ptU_[] = {{0, 0}, {-SIZE_, SIZE_}, {SIZE_, SIZE_}};
00093     Point NumericUpDown::ptD_[] = {{0, SIZE_}, {SIZE_, 0}, {-SIZE_, 0}};
00094 }