a
F746_SLIDER.cpp@0:a7fb0dba4c8a, 2019-10-09 (annotated)
- Committer:
- fundokukiri
- Date:
- Wed Oct 09 12:55:47 2019 +0000
- Revision:
- 0:a7fb0dba4c8a
a
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fundokukiri | 0:a7fb0dba4c8a | 1 | //----------------------------------------------------------- |
fundokukiri | 0:a7fb0dba4c8a | 2 | // |
fundokukiri | 0:a7fb0dba4c8a | 3 | // F746_SLIDER class |
fundokukiri | 0:a7fb0dba4c8a | 4 | // |
fundokukiri | 0:a7fb0dba4c8a | 5 | //----------------------------------------------------------- |
fundokukiri | 0:a7fb0dba4c8a | 6 | |
fundokukiri | 0:a7fb0dba4c8a | 7 | #include "F746_SLIDER.hpp" |
fundokukiri | 0:a7fb0dba4c8a | 8 | |
fundokukiri | 0:a7fb0dba4c8a | 9 | extern uint16_t SliderDisplayValue_; |
fundokukiri | 0:a7fb0dba4c8a | 10 | |
fundokukiri | 0:a7fb0dba4c8a | 11 | // Draw Slider |
fundokukiri | 0:a7fb0dba4c8a | 12 | void Slider::Render() |
fundokukiri | 0:a7fb0dba4c8a | 13 | { |
fundokukiri | 0:a7fb0dba4c8a | 14 | active_ = true; |
fundokukiri | 0:a7fb0dba4c8a | 15 | char min_[3]; //string Slider minimum; |
fundokukiri | 0:a7fb0dba4c8a | 16 | char max_[3]; //string Slider maximum; |
fundokukiri | 0:a7fb0dba4c8a | 17 | |
fundokukiri | 0:a7fb0dba4c8a | 18 | switch(STYLE_) |
fundokukiri | 0:a7fb0dba4c8a | 19 | { |
fundokukiri | 0:a7fb0dba4c8a | 20 | case 1: // Style 1 - Normal Slider |
fundokukiri | 0:a7fb0dba4c8a | 21 | lcd_.SetTextColor(SLIDER_COLOUR_); // Slider rectangle |
fundokukiri | 0:a7fb0dba4c8a | 22 | lcd_.FillRect(SliderX_, SliderY_, SliderW_, 40); |
fundokukiri | 0:a7fb0dba4c8a | 23 | lcd_.SetTextColor(LCD_COLOR_GRAY); // Slider Control rectangle |
fundokukiri | 0:a7fb0dba4c8a | 24 | uint16_t xC = (SliderW_/(Max_-Min_)* valueControl_); // Calculate initial value of Slider control |
fundokukiri | 0:a7fb0dba4c8a | 25 | lcd_.FillRect(SliderX_+xC-20, SliderY_, 40, 40); |
fundokukiri | 0:a7fb0dba4c8a | 26 | break; |
fundokukiri | 0:a7fb0dba4c8a | 27 | |
fundokukiri | 0:a7fb0dba4c8a | 28 | case 2: // Style 2 - 3D Slider |
fundokukiri | 0:a7fb0dba4c8a | 29 | lcd_.SetTextColor(LCD_COLOR_DARKGRAY); // Set Textcolour to shadow colour |
fundokukiri | 0:a7fb0dba4c8a | 30 | lcd_.FillRect(SliderX_+2, SliderY_+2, SliderW_+3, 40+3); // Draws shadow |
fundokukiri | 0:a7fb0dba4c8a | 31 | lcd_.SetTextColor(SLIDER_COLOUR_); // Slider rectangle |
fundokukiri | 0:a7fb0dba4c8a | 32 | lcd_.FillRect(SliderX_, SliderY_, SliderW_, 40); |
fundokukiri | 0:a7fb0dba4c8a | 33 | lcd_.SetTextColor(LCD_COLOR_GRAY); // Slider Control rectangle |
fundokukiri | 0:a7fb0dba4c8a | 34 | xC = (SliderW_/(Max_-Min_)* valueControl_); // Calculate initial value of Slider control |
fundokukiri | 0:a7fb0dba4c8a | 35 | lcd_.FillRect(SliderX_+xC-20, SliderY_, 40, 40); |
fundokukiri | 0:a7fb0dba4c8a | 36 | break; |
fundokukiri | 0:a7fb0dba4c8a | 37 | } |
fundokukiri | 0:a7fb0dba4c8a | 38 | |
fundokukiri | 0:a7fb0dba4c8a | 39 | if (LABEL_.length() != 0) |
fundokukiri | 0:a7fb0dba4c8a | 40 | { |
fundokukiri | 0:a7fb0dba4c8a | 41 | lcd_.SetFont(FONTS_); |
fundokukiri | 0:a7fb0dba4c8a | 42 | lcd_.SetBackColor(LCD_COLOR_WHITE); |
fundokukiri | 0:a7fb0dba4c8a | 43 | lcd_.SetTextColor(LCD_COLOR_BLACK); |
fundokukiri | 0:a7fb0dba4c8a | 44 | |
fundokukiri | 0:a7fb0dba4c8a | 45 | sprintf(min_, "%2d", (int) Min_); // Convert minimum value to string |
fundokukiri | 0:a7fb0dba4c8a | 46 | lcd_.DisplayStringAt(SliderX_, SliderY_+50, (uint8_t *)min_, LEFT_MODE); // Display Slider minimum value |
fundokukiri | 0:a7fb0dba4c8a | 47 | |
fundokukiri | 0:a7fb0dba4c8a | 48 | sprintf(max_, "%2d", (int) Max_); // Convert maximum value to string |
fundokukiri | 0:a7fb0dba4c8a | 49 | lcd_.DisplayStringAt((SliderX_+SliderW_-40), (SliderY_+50), (uint8_t *)max_, LEFT_MODE); // Display Slider minimum value |
fundokukiri | 0:a7fb0dba4c8a | 50 | |
fundokukiri | 0:a7fb0dba4c8a | 51 | uint16_t x0 = SliderX_ + (SliderW_ - FONT_WIDTH_*(LABEL_.length()))/2; // Calcukate middle x value for Slider name |
fundokukiri | 0:a7fb0dba4c8a | 52 | uint16_t y0 = SliderY_ + (SliderH_ - FONT_HEIGHT_)/2 + 1; // Calcukate y value for Slider name |
fundokukiri | 0:a7fb0dba4c8a | 53 | lcd_.DisplayStringAt(x0, y0-50, (uint8_t *)LABEL_.c_str(), |
fundokukiri | 0:a7fb0dba4c8a | 54 | LEFT_MODE); // Write Slider name |
fundokukiri | 0:a7fb0dba4c8a | 55 | } |
fundokukiri | 0:a7fb0dba4c8a | 56 | } |
fundokukiri | 0:a7fb0dba4c8a | 57 | |
fundokukiri | 0:a7fb0dba4c8a | 58 | |
fundokukiri | 0:a7fb0dba4c8a | 59 | // Service Slider |
fundokukiri | 0:a7fb0dba4c8a | 60 | void Slider::Service() |
fundokukiri | 0:a7fb0dba4c8a | 61 | { |
fundokukiri | 0:a7fb0dba4c8a | 62 | uint16_t xC_; // X value of Control rectangle |
fundokukiri | 0:a7fb0dba4c8a | 63 | uint16_t valueControl_; // Value of Slider control to display |
fundokukiri | 0:a7fb0dba4c8a | 64 | |
fundokukiri | 0:a7fb0dba4c8a | 65 | switch(STYLE_) |
fundokukiri | 0:a7fb0dba4c8a | 66 | { |
fundokukiri | 0:a7fb0dba4c8a | 67 | case 1: // Style 1 - Normal button |
fundokukiri | 0:a7fb0dba4c8a | 68 | lcd_.SetTextColor(SLIDER_COLOUR_); // Draw Slider rectangle |
fundokukiri | 0:a7fb0dba4c8a | 69 | lcd_.FillRect(SliderX_, SliderY_, SliderW_, 40); |
fundokukiri | 0:a7fb0dba4c8a | 70 | break; |
fundokukiri | 0:a7fb0dba4c8a | 71 | |
fundokukiri | 0:a7fb0dba4c8a | 72 | case 2: // Style 2 - 3D button |
fundokukiri | 0:a7fb0dba4c8a | 73 | lcd_.SetTextColor(LCD_COLOR_DARKGRAY); // Set Textcolour to shadow colour |
fundokukiri | 0:a7fb0dba4c8a | 74 | lcd_.FillRect(SliderX_+2, SliderY_+2, SliderW_+3, 40+3);// Draws shadow |
fundokukiri | 0:a7fb0dba4c8a | 75 | lcd_.SetTextColor(SLIDER_COLOUR_); // Slider rectangle |
fundokukiri | 0:a7fb0dba4c8a | 76 | lcd_.FillRect(SliderX_, SliderY_, SliderW_, 40); |
fundokukiri | 0:a7fb0dba4c8a | 77 | lcd_.SetTextColor(LCD_COLOR_GRAY); // Slider Control rectangle |
fundokukiri | 0:a7fb0dba4c8a | 78 | break; |
fundokukiri | 0:a7fb0dba4c8a | 79 | } |
fundokukiri | 0:a7fb0dba4c8a | 80 | |
fundokukiri | 0:a7fb0dba4c8a | 81 | uint16_t newX = state_.touchX[0]; // Find new x value of touch |
fundokukiri | 0:a7fb0dba4c8a | 82 | |
fundokukiri | 0:a7fb0dba4c8a | 83 | if ((newX >= SliderX_) and (newX <= SliderX_+ 40)) // if touch at beginning of Slider |
fundokukiri | 0:a7fb0dba4c8a | 84 | { |
fundokukiri | 0:a7fb0dba4c8a | 85 | { xC_ = SliderX_; } // Sets x value of Slider control to left x value defined for slider rectangle |
fundokukiri | 0:a7fb0dba4c8a | 86 | } |
fundokukiri | 0:a7fb0dba4c8a | 87 | |
fundokukiri | 0:a7fb0dba4c8a | 88 | else if ((newX >= SliderX_+SliderW_-40) and (newX <= SliderX_+ SliderW_)) // if touch at the end of Slider |
fundokukiri | 0:a7fb0dba4c8a | 89 | { |
fundokukiri | 0:a7fb0dba4c8a | 90 | xC_ = SliderX_+SliderW_-40; // Sets x value of Slider control to right x value defined for slider rectangle - width of slider control |
fundokukiri | 0:a7fb0dba4c8a | 91 | } |
fundokukiri | 0:a7fb0dba4c8a | 92 | |
fundokukiri | 0:a7fb0dba4c8a | 93 | else xC_ = newX - 20; // if touch inside Slider |
fundokukiri | 0:a7fb0dba4c8a | 94 | |
fundokukiri | 0:a7fb0dba4c8a | 95 | lcd_.SetTextColor(LCD_COLOR_YELLOW); // Colour to change the control of the Slider when touched |
fundokukiri | 0:a7fb0dba4c8a | 96 | lcd_.FillRect(xC_, SliderY_, 40, 40); |
fundokukiri | 0:a7fb0dba4c8a | 97 | |
fundokukiri | 0:a7fb0dba4c8a | 98 | valueControl_ = (newX - SliderX_) * (Max_ - Min_) / SliderW_ + Min_; // Value to display of the control of the Slider |
fundokukiri | 0:a7fb0dba4c8a | 99 | if (valueControl_== (Min_+1))valueControl_= Min_; // Set value value to display to minimum |
fundokukiri | 0:a7fb0dba4c8a | 100 | if (valueControl_== (Max_-1))valueControl_= Max_; // Set value value to display to maximum |
fundokukiri | 0:a7fb0dba4c8a | 101 | |
fundokukiri | 0:a7fb0dba4c8a | 102 | |
fundokukiri | 0:a7fb0dba4c8a | 103 | lcd_.SetTextColor(LCD_COLOR_BLACK); |
fundokukiri | 0:a7fb0dba4c8a | 104 | SliderDisplayValue_ = valueControl_; |
fundokukiri | 0:a7fb0dba4c8a | 105 | lcd_.SetTextColor(LCD_COLOR_YELLOW); |
fundokukiri | 0:a7fb0dba4c8a | 106 | } |
fundokukiri | 0:a7fb0dba4c8a | 107 | |
fundokukiri | 0:a7fb0dba4c8a | 108 | |
fundokukiri | 0:a7fb0dba4c8a | 109 | |
fundokukiri | 0:a7fb0dba4c8a | 110 | bool Slider::Moved() // Check touch detected |
fundokukiri | 0:a7fb0dba4c8a | 111 | { |
fundokukiri | 0:a7fb0dba4c8a | 112 | ts_.GetState(&state_); // Get state of touch |
fundokukiri | 0:a7fb0dba4c8a | 113 | if (!state_.touchDetected) return false; |
fundokukiri | 0:a7fb0dba4c8a | 114 | if (!active_) return false; |
fundokukiri | 0:a7fb0dba4c8a | 115 | if (!SliderBoundaryCheck()) return false; |
fundokukiri | 0:a7fb0dba4c8a | 116 | Service(); // Run Service routine |
fundokukiri | 0:a7fb0dba4c8a | 117 | return SliderBoundaryCheck(); |
fundokukiri | 0:a7fb0dba4c8a | 118 | } |
fundokukiri | 0:a7fb0dba4c8a | 119 | |
fundokukiri | 0:a7fb0dba4c8a | 120 | |
fundokukiri | 0:a7fb0dba4c8a | 121 | bool Slider::SliderBoundaryCheck() // Check if touch is within Slider boundaries |
fundokukiri | 0:a7fb0dba4c8a | 122 | { |
fundokukiri | 0:a7fb0dba4c8a | 123 | int nTouch = multiTouch ? state_.touchDetected : 1; |
fundokukiri | 0:a7fb0dba4c8a | 124 | for (int n=0; n<nTouch; n++) |
fundokukiri | 0:a7fb0dba4c8a | 125 | { |
fundokukiri | 0:a7fb0dba4c8a | 126 | uint16_t x = state_.touchX[n]; // Find x value of touch |
fundokukiri | 0:a7fb0dba4c8a | 127 | uint16_t y = state_.touchY[n]; // Find y value of touch |
fundokukiri | 0:a7fb0dba4c8a | 128 | |
fundokukiri | 0:a7fb0dba4c8a | 129 | if ( (SliderX_ <= x) && (x <= SliderX_+SliderW_) && |
fundokukiri | 0:a7fb0dba4c8a | 130 | (SliderY_ <= y) && (y <= SliderY_+SliderH_) ) return true; // Check if touch is within Slider defined values |
fundokukiri | 0:a7fb0dba4c8a | 131 | } |
fundokukiri | 0:a7fb0dba4c8a | 132 | return false; |
fundokukiri | 0:a7fb0dba4c8a | 133 | } |
fundokukiri | 0:a7fb0dba4c8a | 134 | |
fundokukiri | 0:a7fb0dba4c8a | 135 | TS_StateTypeDef Slider::state_; |
fundokukiri | 0:a7fb0dba4c8a | 136 | bool Slider::multiTouch = false; // Disable multitouch for Slider |
fundokukiri | 0:a7fb0dba4c8a | 137 |