/* Auxiliary construction to save RGB colour values */
struct Max_RGBFarbe {
int R;
int G;
int B;
};
struct Max_Ausgang {
Max_RGBFarbe farbe;
int x = 0;
int y = 0;
};
/* ************************************************
One button as an object for all buttons.
Works as a button or switch.
An object consists of properties and methods (functions).
Properties:
name
x1, y1, x2, y2
fontkorreturX, fontkorreturY
buttonFarbe, buttonFarbeFrame, buttonFarbePressed
Methods:
drawButton()
drawButtonPressed()
bool isPressed(int x, int y)
* ************************************************ */
class Max_Button {
public:
// Internal coordinates:
int x1 = 0; // Upper left corner in pixels
int y1 = 0;
int x2 = 0; // lower right corner in pixels
int y2 = 0;
String name = "Button-Name";
// 0:Push-button,
// 1: Switch,
// 2: Controller,
// 3: Display text,
// 4: Display outputs
int mode = 0;
// Position and size in pixels.
int button_x = 10;
int button_y = 10;
int button_width = 100;
int button_height = 100;
int fontkorreturX = 0;
int fontkorreturY = 0;
// Value of the switch (mode 1)
bool stateSchalter = false; // Switch on or off.
// Parameter of the controller(mode 2)
float regler_min = 0.0;
float regler_max = 100.0;
float regler_value = 0.0;
int touch_x_last = button_x;
int touch_x = button_x; // the current touch coordinates
int touch_y = button_x;
// Status display outputs
int anzeige_ausg = 0; // 1, 2, 3, 4
Max_Ausgang anzeige_ausg1;
Max_Ausgang anzeige_ausg2;
Max_Ausgang anzeige_ausg3;
Max_Ausgang anzeige_ausg4;
// Struct for RGB colour values
Max_RGBFarbe buttonFarbe;
Max_RGBFarbe buttonFarbeFrame;
Max_RGBFarbe buttonFarbePressed;
Max_RGBFarbe buttonFarbeText;
Max_RGBFarbe buttonFarbeRegler;
/* Das ist der Konstruktor des Objekts.
*/
Max_Button() {
// Structs have to be initialised in the Constructor.
buttonFarbeRegler.R = 150;
buttonFarbeRegler.G = 150;
buttonFarbeRegler.B = 238;
buttonFarbe.R = 0; // Blue
buttonFarbe.G = 0;
buttonFarbe.B = 238;
buttonFarbeFrame.R = 255; // White
buttonFarbeFrame.G = 255;
buttonFarbeFrame.B = 255;
buttonFarbeText.R = 255; // White
buttonFarbeText.G = 255;
buttonFarbeText.B = 255;
buttonFarbePressed.R = 255; // Red
buttonFarbePressed.G = 0;
buttonFarbePressed.B = 0;
anzeige_ausg1.x = 65;
anzeige_ausg1.y = 65;
anzeige_ausg1.farbe.R = 255;
anzeige_ausg1.farbe.G = 0;
anzeige_ausg1.farbe.B = 0;
anzeige_ausg2.x = 65;
anzeige_ausg2.y = 65 + 110;
anzeige_ausg2.farbe.R = 255;
anzeige_ausg2.farbe.G = 0;
anzeige_ausg2.farbe.B = 0;
anzeige_ausg3.x = 65;
anzeige_ausg3.y = 65 + 2 * 110;
// Since it is black like the background,
// we draw white circles here.
anzeige_ausg3.farbe.R = 255;
anzeige_ausg3.farbe.G = 255;
anzeige_ausg3.farbe.B = 255;
anzeige_ausg4.x = 65;
anzeige_ausg4.y = 65 + 3 * 110;
anzeige_ausg4.farbe.R = 0;
anzeige_ausg4.farbe.G = 0;
anzeige_ausg4.farbe.B = 255;
}
/* This method checks whether the button has been pressed.
Receives the x,y coordinates
of the input device (mouse or touchpad).
It is checked whether the
coordinates lie within the button,
If the button was pressed, it is drawn.*/
bool isPressed(int x, int y) {
bool result = false;
this->touch_x = x;
this->touch_y = y;
this->x1 = this->button_x;
this->y1 = this->button_y;
x2 = button_x + button_width;
y2 = button_y + button_height;
result = (x >= this->x1)
&& (x <= this->x2)
&& (y >= this->y1)
&& (y <= this->y2);
if(result){
drawButtonPressed();
}
return result;
}
/* Method for drawing the (unpressed) button. */
void drawButton() {
this->x1 = this->button_x;
this->y1 = this->button_y;
x2 = button_x + button_width;
y2 = button_y + button_height;
// 0:Push-button, 1: Switch, 2: Controller, 3: Display
if (mode == 2) {
paintRegler();
} else if (mode == 3) {
paintAnzeige(); // Text
} else if (mode == 4) {
paintAnzeigeAusgang();
} else {
paintButton();
}
}
/* Draws the button when it is pressed. */
void drawButtonPressed() {
this->x1 = this->button_x;
this->y1 = this->button_y;
x2 = button_x + button_width;
y2 = button_y + button_height;
// 0:Taster, 1: Schalter, 2: Regler, 3: Anzeige
if (mode == 2) {
paintReglerPressed();
} else if (mode == 3) {
// do nothing
} else if (mode == 1) {
// Button pressed...
paintButtonPressed();
if (stateSchalter) {
paintButton();
stateSchalter = false;
} else {
stateSchalter = true;
}
} else if (mode == 0) {
// Button pressed...
paintButtonPressed();
// As long as the keyboard is pressed,
// it hangs in the loop and waits.
// It reads the values at each loop pass
// and does not use them any further.
// It only continues when the key is released
//and myTouch.dataAvailable() returns FALSE.
while (myTouch.dataAvailable()) {
myTouch.read();
}
paintButton();
}
}
void paintButton() {
// Filled rectangle with rounded corners
myGLCD.setColor(buttonFarbe.R, buttonFarbe.G, buttonFarbe.B);
myGLCD.fillRoundRect (this->x1, this->y1, this->x2, this->y2);
// Frame without infill
myGLCD.setColor(
buttonFarbeFrame.R,
buttonFarbeFrame.G,
buttonFarbeFrame.B);
myGLCD.drawRoundRect (this->x1, this->y1, this->x2, this->y2);
// Text - The text is output centred in the button
myGLCD.setColor(
buttonFarbeText.R,
buttonFarbeText.G,
buttonFarbeText.B);
myGLCD.setFont(BigFont); // SevenSegNumFont, BigFont
myGLCD.setBackColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B); // Font background colour
myGLCD.print(this->name,
this->x1 + (this->x2 - this->x1) / 2 - fontkorreturX,
this->y1 + (this->y2 - this->y1) / 2 - fontkorreturY
);
}
void paintButtonPressed() {
// Filled rectangle with rounded corners
myGLCD.setColor(
buttonFarbePressed.R,
buttonFarbePressed.G,
buttonFarbePressed.B);
myGLCD.fillRoundRect (this->x1, this->y1, this->x2, this->y2);
// Frame without infill
myGLCD.setColor(
buttonFarbeFrame.R,
buttonFarbeFrame.G,
buttonFarbeFrame.B);
myGLCD.drawRoundRect (this->x1, this->y1, this->x2, this->y2);
// Text - The text is output centred in the button
myGLCD.setFont(BigFont);
myGLCD.setColor(
buttonFarbeText.R,
buttonFarbeText.G,
buttonFarbeText.B
);
myGLCD.setBackColor(
buttonFarbePressed.R,
buttonFarbePressed.G,
buttonFarbePressed.B); // Font background colour
myGLCD.print(
this->name,
this->x1 + (this->x2 - this->x1) / 2 - fontkorreturX,
this->y1 + (this->y2 - this->y1) / 2 - fontkorreturY
);
}
void paintAnzeige() {
buttonFarbeFrame.R = buttonFarbe.R;
buttonFarbeFrame.G = buttonFarbe.G;
buttonFarbeFrame.B = buttonFarbe.B;
// Filled rectangle with rounded corners
myGLCD.setColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B);
myGLCD.fillRoundRect(
this->x1,
this->y1,
this->x2,
this->y2);
// Frame without infill
myGLCD.setColor(
buttonFarbeFrame.R,
buttonFarbeFrame.G,
buttonFarbeFrame.B
);
myGLCD.drawRoundRect (this->x1, this->y1, this->x2, this->y2);
// Text - The text is output centred in the button
myGLCD.setColor(
buttonFarbeText.R,
buttonFarbeText.G,
buttonFarbeText.B
);
// SevenSegmentFull,
// SevenSegNumFont,
// SixteenSegment128x192Num,
// DotMatrix_M_Slash,
// GroteskBold16x32
myGLCD.setFont(DotMatrix_M_Slash);
myGLCD.setBackColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B
); // Hintergrundfarbe des Fonts
myGLCD.print(
this->name,
this->x1 + (this->x2 - this->x1) / 2 - fontkorreturX,
this->y1 + (this->y2 - this->y1) / 2 - fontkorreturY
);
}
void paintAnzeigeAusgang() {
// Filled rectangle with rounded corners
myGLCD.setColor(0, 0, 0);
myGLCD.fillRoundRect (this->x1, this->y1, this->x2, this->y2);
// Paint circles
if (anzeige_ausg == 1) {
// 2
myGLCD.setColor(
anzeige_ausg2.farbe.R,
anzeige_ausg2.farbe.G,
anzeige_ausg2.farbe.B);
myGLCD.fillCircle(
this->x1 + anzeige_ausg2.x,
this->y1 + anzeige_ausg2.y,
25);
myGLCD.setColor(0, 0, 0);
myGLCD.fillCircle(
this->x1 + anzeige_ausg2.x,
this->y1 + anzeige_ausg2.y,
13);
// 3
myGLCD.setColor(
anzeige_ausg3.farbe.R,
anzeige_ausg3.farbe.G,
anzeige_ausg3.farbe.B
);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
25);
myGLCD.setColor(255, 255, 255);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
13
);
} else if (anzeige_ausg == 2) {
// 3
myGLCD.setColor(
anzeige_ausg3.farbe.R,
anzeige_ausg3.farbe.G,
anzeige_ausg3.farbe.B
);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
25 );
myGLCD.setColor(255, 255, 255);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
13 );
// 4
myGLCD.setColor(
anzeige_ausg4.farbe.R,
anzeige_ausg4.farbe.G,
anzeige_ausg4.farbe.B);
myGLCD.fillCircle(
this->x1 + anzeige_ausg4.x,
this->y1 + anzeige_ausg4.y,
25 );
myGLCD.setColor(0, 0, 0);
myGLCD.fillCircle(
this->x1 + anzeige_ausg4.x,
this->y1 + anzeige_ausg4.y,
13 );
} else if (anzeige_ausg == 3) {
// 1
myGLCD.setColor(
anzeige_ausg1.farbe.R,
anzeige_ausg1.farbe.G,
anzeige_ausg1.farbe.B);
myGLCD.fillCircle(
this->x1 + anzeige_ausg1.x,
this->y1 + anzeige_ausg1.y,
25 );
myGLCD.setColor(0, 0, 0);
myGLCD.fillCircle(
this->x1 + anzeige_ausg1.x,
this->y1 + anzeige_ausg1.y,
13 );
// 3
myGLCD.setColor(
anzeige_ausg3.farbe.R,
anzeige_ausg3.farbe.G,
anzeige_ausg3.farbe.B);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
25 );
myGLCD.setColor(255, 255, 255);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
13 );
} else if (anzeige_ausg == 4) {
// 2
myGLCD.setColor(
anzeige_ausg2.farbe.R,
anzeige_ausg2.farbe.G,
anzeige_ausg2.farbe.B);
myGLCD.fillCircle(
this->x1 + anzeige_ausg2.x,
this->y1 + anzeige_ausg2.y,
25 );
myGLCD.setColor(0, 0, 0);
myGLCD.fillCircle(
this->x1 + anzeige_ausg2.x,
this->y1 + anzeige_ausg2.y,
13 );
// 3
myGLCD.setColor(
anzeige_ausg3.farbe.R,
anzeige_ausg3.farbe.G,
anzeige_ausg3.farbe.B);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
25 );
myGLCD.setColor(255, 255, 255);
myGLCD.drawCircle(
this->x1 + anzeige_ausg3.x,
this->y1 + anzeige_ausg3.y,
13 );
// 4
myGLCD.setColor(
anzeige_ausg4.farbe.R,
anzeige_ausg4.farbe.G,
anzeige_ausg4.farbe.B);
myGLCD.fillCircle(
this->x1 + anzeige_ausg4.x,
this->y1 + anzeige_ausg4.y,
25 );
myGLCD.setColor(0, 0, 0);
myGLCD.fillCircle(
this->x1 + anzeige_ausg4.x,
this->y1 + anzeige_ausg4.y,
13 );
} else { // 0
}
}
void paintRegler() {
// Button
myGLCD.setColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B);
myGLCD.fillRoundRect(
this->x1,
this->y1,
this->x2,
this->y2);
// Frame
myGLCD.setColor(
buttonFarbeFrame.R,
buttonFarbeFrame.G,
buttonFarbeFrame.B
);
myGLCD.drawRoundRect (this->x1, this->y1, this->x2, this->y2);
// filled rectangle for the stand
// -------------------------------
// The controller
int sx1 = button_x;
int sy1 = button_y;
// or simply x_touch
int sx2 = button_x + button_width * regler_value / regler_max;
int sy2 = button_y + button_height;
myGLCD.setColor(
buttonFarbeRegler.R,
buttonFarbeRegler.G,
buttonFarbeRegler.B);
myGLCD.fillRoundRect (sx1, sy1, sx2, sy2);
// -------------------------------
// Text - The text is output centred in the button
myGLCD.setColor(
buttonFarbeText.R,
buttonFarbeText.G,
buttonFarbeText.B);
myGLCD.setFont(BigFont); // SevenSegNumFont, BigFont
myGLCD.setBackColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B); // Font background colour
myGLCD.print(
this->name,
this->x1 + (this->x2 - this->x1) / 2 - fontkorreturX,
this->y1 + (this->y2 - this->y1) / 2 - fontkorreturY
);
}
void paintReglerPressed() {
if (touch_x != touch_x_last) {
touch_x_last = touch_x;
// Button
myGLCD.setColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B);
myGLCD.fillRoundRect(
this->x1, this->y1, this->x2, this->y2);
// Frame
myGLCD.setColor(
buttonFarbeFrame.R,
buttonFarbeFrame.G,
buttonFarbeFrame.B);
myGLCD.drawRoundRect (this->x1, this->y1, this->x2, this->y2);
// -------------------------------
// The controller
int sx1 = button_x;
int sy1 = button_y;
int sx2 = touch_x;
int sy2 = button_y + button_height;
regler_value = 100.00
* ((float)touch_x - (float)button_x) / (float)button_width;
Serial.print(regler_value);
Serial.print(" = 100* (");
Serial.print(touch_x);
Serial.print("-");
Serial.print(button_x);
Serial.print(" ) /");
Serial.println(button_width);
myGLCD.setColor(
buttonFarbeRegler.R,
buttonFarbeRegler.G,
buttonFarbeRegler.B);
myGLCD.fillRoundRect (sx1, sy1, sx2, sy2);
// -------------------------------
// Text - The text is output centred in the button
myGLCD.setFont(BigFont);
myGLCD.setColor(
buttonFarbeText.R,
buttonFarbeText.G,
buttonFarbeText.B);
myGLCD.setBackColor(
buttonFarbe.R,
buttonFarbe.G,
buttonFarbe.B); // Hintergrundfarbe des Fonts
myGLCD.print(
this->name,
this->x1 + (this->x2 - this->x1) / 2 - fontkorreturX,
this->y1 + (this->y2 - this->y1) / 2 - fontkorreturY
);
}
}
}; // End Button Object