C++ Gurus

Doug Gentges doug.gentges at gmail.com
Fri Feb 22 22:59:14 CST 2013


>From a data hiding point of view,  i think it might make more sense to wrap
the touchscreen interface in a class,  and do the conversion to pixel
coordinates there.   That way,  you're limiting the amount of code that is
aware of the touchscreen coordinate system,  thereby limiting the number of
places you would have to make changes if that interface were to ever
change.

Another option would be to do the conversion in the outer loop,  and then
pass the x and y to each button.   You're already retrieving the point from
the touchscreen anyway,  so convert it there,  and avoid the duplicate code
in the isPressed method

Doug
On Feb 22, 2013 3:30 PM, "Karl W4KRL" <W4KRL at arrl.net> wrote:

> I am creating a Button class to use with a touchscreen display. The
> touchscreen is actually a separate device glued to the front of the LCD
> display. The class must translate the touchscreen coordinates to the LCD
> coordinates to test if the user is touching the screen at the button
> position.****
>
> ** **
>
> Each button has several unique visible properties like position, size and
> color. The parameters needed to translate the touchscreen to LCD are the
> same for each button. However, they are unknown with precision until the
> screen is calibrated. I do have some generic parameters that are close
> enough without calibration.****
>
> ** **
>
> How do I get the touchscreen parameters into the class so that all objects
> will be able to do the translation? At the moment the generic parameters
> are hard coded into the class constructor. Is there a clever way to get the
> parameters into the class?****
>
> ** **
>
> Thanks, Karl W4KRL****
>
> ** **
>
> PS This code snippet works.****
>
> ** **
>
> class Button {****
>
>   public:****
>
>     Button();****
>
>     // constructor - TBD   ****
>
>     void setButton(int x, int y, int width, int height, unsigned int
> color);****
>
>     // place a button on the screen with upper left corner at (x, y) with
> width w, height h, and color****
>
>     void updateColor(unsigned int color); // must have more features - TBD
> ****
>
>     void setTouch(int tXmin, int tXmax, int tYmin, int tYmax, int tZmin,
> int tZmax);****
>
>     // set touchscreen limits    ****
>
>     bool isPressed();****
>
>     // true if button is pressed****
>
> ** **
>
>   private:****
>
>     Point p;                                             // place where
> user is pressing****
>
>     int _x, _y, _w, _h;                                  // button coords
> & dimensions****
>
>     unsigned int _c;                                     // button
> background color****
>
>     int _tXmin, _tXmax, _tYmin, _tYmax, _tZmin, _tZmax;  // touch plate
> ADC readings****
>
> };****
>
> ** **
>
> void Button::setButton (int x, int y, int width, int height, unsigned int
> color) {****
>
>   _x = x;****
>
>   _y = y;****
>
>   _w = width;****
>
>   _h = height;****
>
>   _c = color;****
>
>   lcd.fillRoundRect(_x, _y, _w, _h, 5, _c);              // radius 5****
>
> }****
>
> ** **
>
> void Button::updateColor (unsigned int color) {setButton(_x, _y, _w, _h,
> color);} // is this clever?****
>
> ** **
>
> // first cut at constructor****
>
> Button::Button() {****
>
>   _x = 10;       //generic button parameters****
>
>   _y = 10;****
>
>   _w = 10;****
>
>   _h = 10;****
>
>   _c = WHITE;****
>
>   _tXmin = 175;  // generic touchscreen parameters****
>
>   _tXmax = 915;****
>
>   _tYmin = 155;****
>
>   _tYmax = 920;****
>
>   _tZmin = 10;****
>
>   _tZmax = 1000;****
>
> }****
>
> ** **
>
> void Button::setTouch(int tXmin, int tXmax, int tYmin, int tYmax, int
> tZmin, int tZmax) {****
>
>   _tXmin = tXmin;****
>
>   _tXmax = tXmax;****
>
>   _tYmin = tYmin;****
>
>   _tYmax = tYmax;****
>
>   _tZmin = tZmin;****
>
>   _tZmax = tZmax;****
>
> }****
>
> ** **
>
> bool Button::isPressed () {****
>
>   //this is a first cut****
>
>   Point p = ts.getPoint();****
>
>   if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {****
>
>     // must set the pinMode to OUTPUT or the LCD will not write****
>
>     pinMode(XM, OUTPUT);****
>
>     pinMode(YP, OUTPUT);****
>
>     ****
>
>     // map from analog input 0->1023 to lcd.width****
>
>     p.x = map(p.x, TS_MINX, TS_MAXX, lcd.width(), 0);****
>
>     p.y = map(p.y, TS_MINY, TS_MAXY, lcd.height(), 0);****
>
>   }  ****
>
>   return ((p.x >= _x) && (p.x <= _x + _w) && (p.y >= _y) && (p.y <= _y +
> _h));****
>
> }****
>
> ** **
>
>   Button b1, b2;                            // instantiate a few smart
> button objects****
>
> ** **
>
> void setup(void) {****
>
>   Serial.begin(9600);****
>
>   Serial.println("Button_OOP01");****
>
>   ****
>
>   lcd.reset();****
>
>   lcd.initDisplay();****
>
>   lcd.fillScreen(BLACK);****
>
> ** **
>
>   b1.setButton(50, 50, 50, 50, RED);        // set the visible properties*
> ***
>
>   b2.setButton(100,100,20,20, YELLOW);****
>
> }****
>
> ** **
>
> void loop() {****
>
>     Point p = ts.getPoint();****
>
>     if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {****
>
>       pinMode(XM, OUTPUT);****
>
>       pinMode(YP, OUTPUT);****
>
> ** **
>
>       if (b1.isPressed()) {****
>
>         Serial.println("B1: ");  ****
>
>       }****
>
>       if (b2.isPressed()) {****
>
>         Serial.println("B2: ");  ****
>
>       }****
>
>   }****
>
> }****
>
> ** **
>
> _______________________________________________
> Tacos mailing list
> Tacos at amrad.org
> https://amrad.org/mailman/listinfo/tacos
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://amrad.org/pipermail/tacos/attachments/20130222/410405ee/attachment.html>


More information about the Tacos mailing list