a

Dependencies:   TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG

Committer:
tquang14
Date:
Tue Oct 08 09:11:23 2019 +0000
Revision:
1:dcda1118b4ef
Parent:
0:151a96a0fc95
aaaaa

Who changed what in which revision?

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