a

Committer:
fundokukiri
Date:
Wed Oct 09 12:55:47 2019 +0000
Revision:
0:a7fb0dba4c8a
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fundokukiri 0:a7fb0dba4c8a 1 /*-----------------------------------------------------------
fundokukiri 0:a7fb0dba4c8a 2 * F746_BUTTON Library v1.0
fundokukiri 0:a7fb0dba4c8a 3 * Copyright (c) 2018 Wynand Steenberg
fundokukiri 0:a7fb0dba4c8a 4 * s216875730@mandela.ac.za
fundokukiri 0:a7fb0dba4c8a 5 *
fundokukiri 0:a7fb0dba4c8a 6 *
fundokukiri 0:a7fb0dba4c8a 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
fundokukiri 0:a7fb0dba4c8a 8 * of this software and associated documentation files (the "Software"), to deal
fundokukiri 0:a7fb0dba4c8a 9 * in the Software without restriction, including without limitation the rights
fundokukiri 0:a7fb0dba4c8a 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
fundokukiri 0:a7fb0dba4c8a 11 * copies of the Software, and to permit persons to whom the Software is
fundokukiri 0:a7fb0dba4c8a 12 * furnished to do so, subject to the following conditions:
fundokukiri 0:a7fb0dba4c8a 13 *
fundokukiri 0:a7fb0dba4c8a 14 * The above copyright notice and this permission notice shall be included in
fundokukiri 0:a7fb0dba4c8a 15 * all copies or substantial portions of the Software.
fundokukiri 0:a7fb0dba4c8a 16 *
fundokukiri 0:a7fb0dba4c8a 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
fundokukiri 0:a7fb0dba4c8a 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
fundokukiri 0:a7fb0dba4c8a 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
fundokukiri 0:a7fb0dba4c8a 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
fundokukiri 0:a7fb0dba4c8a 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
fundokukiri 0:a7fb0dba4c8a 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
fundokukiri 0:a7fb0dba4c8a 23 * THE SOFTWARE.
fundokukiri 0:a7fb0dba4c8a 24 *-----------------------------------------------------------
fundokukiri 0:a7fb0dba4c8a 25 */
fundokukiri 0:a7fb0dba4c8a 26
fundokukiri 0:a7fb0dba4c8a 27 #ifndef F746_BUTTON_HPP
fundokukiri 0:a7fb0dba4c8a 28 #define F746_BUTTON_HPP
fundokukiri 0:a7fb0dba4c8a 29
fundokukiri 0:a7fb0dba4c8a 30 #include "mbed.h"
fundokukiri 0:a7fb0dba4c8a 31 #include <string>
fundokukiri 0:a7fb0dba4c8a 32 #include "TS_DISCO_F746NG.h"
fundokukiri 0:a7fb0dba4c8a 33 #include "LCD_DISCO_F746NG.h"
fundokukiri 0:a7fb0dba4c8a 34 #include "F746GUI.hpp"
fundokukiri 0:a7fb0dba4c8a 35
fundokukiri 0:a7fb0dba4c8a 36 /** A Class library for using Buttons on the DISCO-F746NG Development board. The class
fundokukiri 0:a7fb0dba4c8a 37 * uses the existing BSP class created by Team ST.
fundokukiri 0:a7fb0dba4c8a 38 *
fundokukiri 0:a7fb0dba4c8a 39 * Example:
fundokukiri 0:a7fb0dba4c8a 40 * @code
fundokukiri 0:a7fb0dba4c8a 41 * #include "mbed.h"
fundokukiri 0:a7fb0dba4c8a 42 * #include "F746_BUTTON.hpp"
fundokukiri 0:a7fb0dba4c8a 43 *
fundokukiri 0:a7fb0dba4c8a 44 * TS_DISCO_F746NG ts_;
fundokukiri 0:a7fb0dba4c8a 45 * LCD_DISCO_F746NG lcd_;
fundokukiri 0:a7fb0dba4c8a 46 *
fundokukiri 0:a7fb0dba4c8a 47 * int main()
fundokukiri 0:a7fb0dba4c8a 48 * {
fundokukiri 0:a7fb0dba4c8a 49 * lcd_.Clear(LCD_COLOR_WHITE); // Set LCD Background colour
fundokukiri 0:a7fb0dba4c8a 50 *
fundokukiri 0:a7fb0dba4c8a 51 * Button btn1(lcd_, ts_, 20, 50, 80, 40,
fundokukiri 0:a7fb0dba4c8a 52 * LCD_COLOR_BLUE, LCD_COLOR_YELLOW, 1, "BUTTON1", Font12); // Define btn1 button
fundokukiri 0:a7fb0dba4c8a 53 * btn1.Render(); // Draw btn1 button
fundokukiri 0:a7fb0dba4c8a 54 *
fundokukiri 0:a7fb0dba4c8a 55 * Button test(lcd_, ts_, 120, 50, 80, 40,
fundokukiri 0:a7fb0dba4c8a 56 * LCD_COLOR_DARKBLUE, LCD_COLOR_GREEN, 1, "TEST", Font12); // Define test button
fundokukiri 0:a7fb0dba4c8a 57 * test.Render(); // Draw test button
fundokukiri 0:a7fb0dba4c8a 58 *
fundokukiri 0:a7fb0dba4c8a 59 * Button show(lcd_, ts_, 220, 50, 80, 40,
fundokukiri 0:a7fb0dba4c8a 60 * LCD_COLOR_BROWN, LCD_COLOR_GRAY, 1, "SHOW", Font12); // Define hide button
fundokukiri 0:a7fb0dba4c8a 61 * show.Hide();
fundokukiri 0:a7fb0dba4c8a 62 *
fundokukiri 0:a7fb0dba4c8a 63 * Button hide(lcd_, ts_, 220, 50, 80, 40,
fundokukiri 0:a7fb0dba4c8a 64 * LCD_COLOR_BROWN, LCD_COLOR_GRAY, 1, "HIDE", Font12); // Define hide button
fundokukiri 0:a7fb0dba4c8a 65 * hide.Render(); // Draw hide button
fundokukiri 0:a7fb0dba4c8a 66 *
fundokukiri 0:a7fb0dba4c8a 67 * Button button3D(lcd_, ts_, 320, 50, 120, 40,
fundokukiri 0:a7fb0dba4c8a 68 * LCD_COLOR_BLUE, LCD_COLOR_YELLOW, 2, "3D BUTTON", Font12); // Define button3D button
fundokukiri 0:a7fb0dba4c8a 69 * button3D.Render(); // Draw 3Dbutton button
fundokukiri 0:a7fb0dba4c8a 70 *
fundokukiri 0:a7fb0dba4c8a 71 * lcd_.SetTextColor(LCD_COLOR_BLACK); // Set Text colour to Black
fundokukiri 0:a7fb0dba4c8a 72 * lcd_.SetFont(&Font12); // Font size 12
fundokukiri 0:a7fb0dba4c8a 73 * lcd_.DisplayStringAt(5, 5, (uint8_t *)"Button / Slider driver for DISCO_F746", LEFT_MODE); // Display main header text
fundokukiri 0:a7fb0dba4c8a 74 * lcd_.DisplayStringAt(5, 20, (uint8_t *)"Button example", LEFT_MODE); // Display secondary header text
fundokukiri 0:a7fb0dba4c8a 75 * lcd_.DisplayStringAt(5, 135, (uint8_t *)"Slider example", LEFT_MODE); // Display secondary header text
fundokukiri 0:a7fb0dba4c8a 76 *
fundokukiri 0:a7fb0dba4c8a 77 * while (true) // Main program loop
fundokukiri 0:a7fb0dba4c8a 78 * {
fundokukiri 0:a7fb0dba4c8a 79 *
fundokukiri 0:a7fb0dba4c8a 80 * if (btn1.Press()) // Check if btn1 button was touched and run instructions if true
fundokukiri 0:a7fb0dba4c8a 81 * {
fundokukiri 0:a7fb0dba4c8a 82 * lcd_.SetFont(&Font12);
fundokukiri 0:a7fb0dba4c8a 83 * lcd_.SetTextColor(LCD_COLOR_BLACK);
fundokukiri 0:a7fb0dba4c8a 84 * lcd_.DisplayStringAt(5, 110, (uint8_t *)"Button1 pressed", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 85 * wait(0.5);
fundokukiri 0:a7fb0dba4c8a 86 * lcd_.DisplayStringAt(5, 110, (uint8_t *)" ", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 87 * } // End btn1 button instructions
fundokukiri 0:a7fb0dba4c8a 88 *
fundokukiri 0:a7fb0dba4c8a 89 * if (test.Press()) // Check if test button was touched and run instructions if true
fundokukiri 0:a7fb0dba4c8a 90 * {
fundokukiri 0:a7fb0dba4c8a 91 * lcd_.SetFont(&Font12);
fundokukiri 0:a7fb0dba4c8a 92 * lcd_.SetTextColor(LCD_COLOR_BLACK);
fundokukiri 0:a7fb0dba4c8a 93 * lcd_.DisplayStringAt(5, 110, (uint8_t *)"TEST pressed", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 94 * wait(0.5);
fundokukiri 0:a7fb0dba4c8a 95 * lcd_.DisplayStringAt(5, 110, (uint8_t *)" ", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 96 *
fundokukiri 0:a7fb0dba4c8a 97 * } // End test button instructions
fundokukiri 0:a7fb0dba4c8a 98 *
fundokukiri 0:a7fb0dba4c8a 99 * if (hide.Press()) // Check if hide button was touched and run instructions if true
fundokukiri 0:a7fb0dba4c8a 100 * {
fundokukiri 0:a7fb0dba4c8a 101 * lcd_.SetFont(&Font12);
fundokukiri 0:a7fb0dba4c8a 102 * lcd_.SetTextColor(LCD_COLOR_BLACK);
fundokukiri 0:a7fb0dba4c8a 103 * lcd_.DisplayStringAt(5, 110, (uint8_t *)"Hide pressed - Hide other buttons", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 104 * btn1.Hide(); // Hide btn1 button
fundokukiri 0:a7fb0dba4c8a 105 * test.Hide(); // Hide test button
fundokukiri 0:a7fb0dba4c8a 106 * hide.Hide();
fundokukiri 0:a7fb0dba4c8a 107 * show.Render();
fundokukiri 0:a7fb0dba4c8a 108 * wait(0.5);
fundokukiri 0:a7fb0dba4c8a 109 * lcd_.DisplayStringAt(5, 110, (uint8_t *)" ", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 110 * } // End hide button instructions
fundokukiri 0:a7fb0dba4c8a 111 *
fundokukiri 0:a7fb0dba4c8a 112 * if (show.Press()) // Check if hide button was touched and run instructions if true
fundokukiri 0:a7fb0dba4c8a 113 * {
fundokukiri 0:a7fb0dba4c8a 114 * lcd_.SetFont(&Font12);
fundokukiri 0:a7fb0dba4c8a 115 * lcd_.SetTextColor(LCD_COLOR_BLACK);
fundokukiri 0:a7fb0dba4c8a 116 * lcd_.DisplayStringAt(5, 110, (uint8_t *)"UNHIDE pressed - Restore other buttons", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 117 * wait(0.5);
fundokukiri 0:a7fb0dba4c8a 118 * lcd_.DisplayStringAt(5, 110, (uint8_t *)" ", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 119 * show.Hide(); // Hide show button before drawing new button in same place
fundokukiri 0:a7fb0dba4c8a 120 * hide.Render(); // Draw hide button after hiding button in same position
fundokukiri 0:a7fb0dba4c8a 121 * btn1.Render(); // Draw btn1 button
fundokukiri 0:a7fb0dba4c8a 122 * test.Render(); // Draw test button
fundokukiri 0:a7fb0dba4c8a 123 *
fundokukiri 0:a7fb0dba4c8a 124 * }
fundokukiri 0:a7fb0dba4c8a 125 *
fundokukiri 0:a7fb0dba4c8a 126 * if (button3D.Press()) // Check if 3Dbutton button was touched and run instructions if true
fundokukiri 0:a7fb0dba4c8a 127 * {
fundokukiri 0:a7fb0dba4c8a 128 * lcd_.SetFont(&Font12);
fundokukiri 0:a7fb0dba4c8a 129 * lcd_.SetTextColor(LCD_COLOR_BLACK);
fundokukiri 0:a7fb0dba4c8a 130 * lcd_.DisplayStringAt(5, 110, (uint8_t *)"3D Button pressed", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 131 * wait(0.5);
fundokukiri 0:a7fb0dba4c8a 132 * lcd_.DisplayStringAt(5, 110, (uint8_t *)" ", LEFT_MODE);
fundokukiri 0:a7fb0dba4c8a 133 * } // End 3D button instructions
fundokukiri 0:a7fb0dba4c8a 134 *
fundokukiri 0:a7fb0dba4c8a 135 * wait(0.02f);
fundokukiri 0:a7fb0dba4c8a 136 * } // End Main program loop
fundokukiri 0:a7fb0dba4c8a 137 * } // End Main program
fundokukiri 0:a7fb0dba4c8a 138 * @endcode
fundokukiri 0:a7fb0dba4c8a 139 */
fundokukiri 0:a7fb0dba4c8a 140
fundokukiri 0:a7fb0dba4c8a 141 class Button
fundokukiri 0:a7fb0dba4c8a 142 {
fundokukiri 0:a7fb0dba4c8a 143 public:
fundokukiri 0:a7fb0dba4c8a 144
fundokukiri 0:a7fb0dba4c8a 145 //! Constructor
fundokukiri 0:a7fb0dba4c8a 146 Button(LCD_DISCO_F746NG &lcd, TS_DISCO_F746NG &ts,
fundokukiri 0:a7fb0dba4c8a 147 uint16_t x, uint16_t y, uint16_t width, uint16_t height,
fundokukiri 0:a7fb0dba4c8a 148 uint32_t buttonColour, uint32_t changeColour,
fundokukiri 0:a7fb0dba4c8a 149 int style, const string label = "", sFONT &fonts = Font12,
fundokukiri 0:a7fb0dba4c8a 150 uint32_t textColour = LCD_COLOR_WHITE)
fundokukiri 0:a7fb0dba4c8a 151 : lcd_(lcd), ts_(ts), ButtonX_(x), ButtonY_(y), ButtonW_(width), ButtonH_(height),
fundokukiri 0:a7fb0dba4c8a 152 BUTTON_COLOUR_(buttonColour), CHANGE_COLOUR_(changeColour),
fundokukiri 0:a7fb0dba4c8a 153 STYLE_(style), LABEL_(label), FONTS_(&fonts), FONT_WIDTH_(fonts.Width),
fundokukiri 0:a7fb0dba4c8a 154 FONT_HEIGHT_(fonts.Height), active_(true)
fundokukiri 0:a7fb0dba4c8a 155 { Render(); }
fundokukiri 0:a7fb0dba4c8a 156
fundokukiri 0:a7fb0dba4c8a 157 /**
fundokukiri 0:a7fb0dba4c8a 158 * @brief Draw Button.
fundokukiri 0:a7fb0dba4c8a 159 *
fundokukiri 0:a7fb0dba4c8a 160 */
fundokukiri 0:a7fb0dba4c8a 161 void Render();
fundokukiri 0:a7fb0dba4c8a 162
fundokukiri 0:a7fb0dba4c8a 163 /**
fundokukiri 0:a7fb0dba4c8a 164 * @brief Draw 3D Button.
fundokukiri 0:a7fb0dba4c8a 165 *
fundokukiri 0:a7fb0dba4c8a 166 */
fundokukiri 0:a7fb0dba4c8a 167 void Render3D();
fundokukiri 0:a7fb0dba4c8a 168
fundokukiri 0:a7fb0dba4c8a 169 /**
fundokukiri 0:a7fb0dba4c8a 170 * @brief Change colour of Button.
fundokukiri 0:a7fb0dba4c8a 171 *
fundokukiri 0:a7fb0dba4c8a 172 */
fundokukiri 0:a7fb0dba4c8a 173 void Change();
fundokukiri 0:a7fb0dba4c8a 174
fundokukiri 0:a7fb0dba4c8a 175 /**
fundokukiri 0:a7fb0dba4c8a 176 * @brief Change colour of 3D Button.
fundokukiri 0:a7fb0dba4c8a 177 *
fundokukiri 0:a7fb0dba4c8a 178 */
fundokukiri 0:a7fb0dba4c8a 179 void Change3D();
fundokukiri 0:a7fb0dba4c8a 180
fundokukiri 0:a7fb0dba4c8a 181 /**
fundokukiri 0:a7fb0dba4c8a 182 * @brief Hide Button.
fundokukiri 0:a7fb0dba4c8a 183 *
fundokukiri 0:a7fb0dba4c8a 184 */
fundokukiri 0:a7fb0dba4c8a 185 void Hide();
fundokukiri 0:a7fb0dba4c8a 186
fundokukiri 0:a7fb0dba4c8a 187 /**
fundokukiri 0:a7fb0dba4c8a 188 * @brief Check touch detected on Button.
fundokukiri 0:a7fb0dba4c8a 189 *
fundokukiri 0:a7fb0dba4c8a 190 */
fundokukiri 0:a7fb0dba4c8a 191 bool Press();
fundokukiri 0:a7fb0dba4c8a 192
fundokukiri 0:a7fb0dba4c8a 193 /**
fundokukiri 0:a7fb0dba4c8a 194 * @brief Check if touch is on Button.
fundokukiri 0:a7fb0dba4c8a 195 *
fundokukiri 0:a7fb0dba4c8a 196 */
fundokukiri 0:a7fb0dba4c8a 197 bool ButtonBoundaryCheck();
fundokukiri 0:a7fb0dba4c8a 198
fundokukiri 0:a7fb0dba4c8a 199 /**
fundokukiri 0:a7fb0dba4c8a 200 * @brief Check previous state of Button.
fundokukiri 0:a7fb0dba4c8a 201 *
fundokukiri 0:a7fb0dba4c8a 202 */
fundokukiri 0:a7fb0dba4c8a 203 static TS_StateTypeDef GottenState()
fundokukiri 0:a7fb0dba4c8a 204 { return state_; }
fundokukiri 0:a7fb0dba4c8a 205
fundokukiri 0:a7fb0dba4c8a 206 /**
fundokukiri 0:a7fb0dba4c8a 207 * @brief Set or reset multi-touch.
fundokukiri 0:a7fb0dba4c8a 208 *
fundokukiri 0:a7fb0dba4c8a 209 */
fundokukiri 0:a7fb0dba4c8a 210 static void SetMultiTouch(bool tf) { multiTouch = tf; }
fundokukiri 0:a7fb0dba4c8a 211
fundokukiri 0:a7fb0dba4c8a 212
fundokukiri 0:a7fb0dba4c8a 213 private:
fundokukiri 0:a7fb0dba4c8a 214
fundokukiri 0:a7fb0dba4c8a 215 LCD_DISCO_F746NG &lcd_; // LCD
fundokukiri 0:a7fb0dba4c8a 216 TS_DISCO_F746NG &ts_; // Touch
fundokukiri 0:a7fb0dba4c8a 217
fundokukiri 0:a7fb0dba4c8a 218 const uint16_t ButtonX_, ButtonY_, ButtonW_, ButtonH_;
fundokukiri 0:a7fb0dba4c8a 219 const uint32_t BUTTON_COLOUR_; // Original colour
fundokukiri 0:a7fb0dba4c8a 220 const uint32_t CHANGE_COLOUR_; // Colour to change to color
fundokukiri 0:a7fb0dba4c8a 221 const int STYLE_; // Button style
fundokukiri 0:a7fb0dba4c8a 222 const string LABEL_; // Button label
fundokukiri 0:a7fb0dba4c8a 223 sFONT *const FONTS_; // Button Style
fundokukiri 0:a7fb0dba4c8a 224 const uint16_t FONT_WIDTH_;
fundokukiri 0:a7fb0dba4c8a 225 const uint16_t FONT_HEIGHT_;
fundokukiri 0:a7fb0dba4c8a 226 bool active_; // Button active boolean
fundokukiri 0:a7fb0dba4c8a 227
fundokukiri 0:a7fb0dba4c8a 228 static TS_StateTypeDef state_;
fundokukiri 0:a7fb0dba4c8a 229 static bool multiTouch;
fundokukiri 0:a7fb0dba4c8a 230
fundokukiri 0:a7fb0dba4c8a 231 /**
fundokukiri 0:a7fb0dba4c8a 232 * @brief Disallow copy constructor and assignment operator.
fundokukiri 0:a7fb0dba4c8a 233 *
fundokukiri 0:a7fb0dba4c8a 234 */
fundokukiri 0:a7fb0dba4c8a 235 Button(const Button&);
fundokukiri 0:a7fb0dba4c8a 236 Button& operator=(const Button&);
fundokukiri 0:a7fb0dba4c8a 237
fundokukiri 0:a7fb0dba4c8a 238
fundokukiri 0:a7fb0dba4c8a 239 };
fundokukiri 0:a7fb0dba4c8a 240 #endif // F746_BUTTON_HPP