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
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 }
Generated on Wed Jul 13 2022 14:24:25 by 1.7.2