class doorgeven in een functie van een class

algemene C code
Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

class doorgeven in een functie van een class

Berichtdoor doebi » 25 Jan 2017, 20:13

Hallo,

Ik wil graag de class tft , welke global (helemaal vooraan in mijn c++ prog) gedeclareerd staat, als parameter doorgeven naar en gebruiken in een andere class.

Bij de code hieronder krijg ik foutmeldingen van de compiler,
zoek er al een tijdje naar, maar geraak er niet uit. :oops:

Mijn bedoeling is om 1 keer de tft te initializeren, en deze dan aan verschillende objecten (in dit geval buttons) door te geven,
zodat deze buttons op de tft kunnen tekenen. Ik wil dit doen d.m.v.de functie doInit.

Maak ik gebruik van de tft door ze te initializeren in de class button, dan gaat het wel, maar dit wil ik vermijden.


Alvast dank,


foutmeldingen :
    C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino: In member function 'void button::doinit(Adafruit_ILI9341&, byte, char*, int, int, int, tButtonType, int, int, int, int)':

    TFT_menu:42: error: use of deleted function 'Adafruit_ILI9341& Adafruit_ILI9341::operator=(const Adafruit_ILI9341&)'

    tft = aTFT;

    ^

    In file included from C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino:2:0:

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:125:7: note: 'Adafruit_ILI9341& Adafruit_ILI9341::operator=(const Adafruit_ILI9341&)' is implicitly deleted because the default definition would be ill-formed:

    class Adafruit_ILI9341 : public Adafruit_GFX {

    ^

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:125:7: error: use of deleted function 'Adafruit_GFX& Adafruit_GFX::operator=(const Adafruit_GFX&)'

    In file included from C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:25:0,

    from C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino:2:

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_GFX_Library/Adafruit_GFX.h:13:7: note: 'Adafruit_GFX& Adafruit_GFX::operator=(const Adafruit_GFX&)' is implicitly deleted because the default definition would be ill-formed:

    class Adafruit_GFX : public Print {

    ^

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_GFX_Library/Adafruit_GFX.h:13:7: error: non-static const member 'const int16_t Adafruit_GFX::WIDTH', can't use default assignment operator

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_GFX_Library/Adafruit_GFX.h:13:7: error: non-static const member 'const int16_t Adafruit_GFX::HEIGHT', can't use default assignment operator

    C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino: At global scope:

    TFT_menu:112: error: use of deleted function 'button::button()'

    button myButton;

    ^

    C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino:17:7: note: 'button::button()' is implicitly deleted because the default definition would be ill-formed:

    class button {

    ^

    TFT_menu:17: error: no matching function for call to 'Adafruit_ILI9341::Adafruit_ILI9341()'

    C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino:17:7: note: candidates are:

    In file included from C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino:2:0:

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:131:3: note: Adafruit_ILI9341::Adafruit_ILI9341(int8_t, int8_t, int8_t)

    Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);

    ^

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:131:3: note: candidate expects 3 arguments, 0 provided

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:129:3: note: Adafruit_ILI9341::Adafruit_ILI9341(int8_t, int8_t, int8_t, int8_t, int8_t, int8_t)

    Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,

    ^

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:129:3: note: candidate expects 6 arguments, 0 provided

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:125:7: note: constexpr Adafruit_ILI9341::Adafruit_ILI9341(const Adafruit_ILI9341&)

    class Adafruit_ILI9341 : public Adafruit_GFX {

    ^

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:125:7: note: candidate expects 1 argument, 0 provided

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:125:7: note: constexpr Adafruit_ILI9341::Adafruit_ILI9341(Adafruit_ILI9341&&)

    C:\Users\Gebruiker\Documents\Arduino\libraries\Adafruit_ILI9341/Adafruit_ILI9341.h:125:7: note: candidate expects 1 argument, 0 provided

    TFT_menu:113: error: use of deleted function 'button::button()'

    button myButton2;

    ^

    TFT_menu:114: error: use of deleted function 'button::button()'

    button myButton3;

    ^

    C:\Users\Gebruiker\Documents\Arduino\ArduinoSMDOven\TFT_menu\TFT_menu.ino: In function 'void setup()':

    TFT_menu:118: error: 'tft' was not declared in this scope

    tft.begin();

    ^

    exit status 1
    use of deleted function 'Adafruit_ILI9341& Adafruit_ILI9341::operator=(const Adafruit_ILI9341&)'



cpp code
#include <Adafruit_FT6206.h>
#include <Adafruit_ILI9341.h>
using namespace std;
#define TFT_CS 10
#define TFT_DC 9

// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 Thectp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
Adafruit_ILI9341 Thetft = Adafruit_ILI9341(TFT_CS, TFT_DC);



enum tButtonType {circle = 2, rect = 0, roundrect = 1} ;
enum tPressed {pressed, unpressed};

class button {
public :
/* // The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
*/ byte buttonNr;
Adafruit_ILI9341 tft;
tButtonType buttonType;
char buttonText[15];
int buttonTextColor;
int buttonBackColor;
int buttonBorderColor;
int buttonX;
int buttonY;
int buttonW;
int buttonH;
void doinit(Adafruit_ILI9341& aTFT, byte aNr, char *aText, int aTextColor, int aBackColor, int aBorderColor , tButtonType aType, int aX, int aY, int aW, int aH);
void drawStringCenter(char *string, int8_t size);
void draw();
bool pressed();
} ;


void button::doinit(Adafruit_ILI9341& aTFT, byte aNr, char *aText, int aTextColor, int aBackColor, int aBorderColor, tButtonType aType, int aX, int aY, int aW, int aH) {
tft = aTFT;
buttonX = aX;
buttonY = aY;
buttonW = aW;
buttonH = aH;
buttonType = aType;
buttonTextColor = aTextColor;
buttonBackColor = aBackColor;
buttonBorderColor = aBorderColor;
buttonNr = aNr;
for (byte aLus = 0; aLus < 15; aLus++) {
buttonText[aLus] = aText[aLus];
}
}

void button::drawStringCenter(char *string, int8_t size)
{
tft.setTextSize(size);
tft.setCursor(buttonX + buttonW / 2 - ( 5 * size * ( strlen(buttonText) / 2) ) , buttonY + buttonH / 2 - (7 * size / 2) );
while (*string)
tft.print( (char) *string++);
Serial.print("lengte ");
Serial.println(strlen(buttonText));
}


void button::draw() {

switch (buttonType) {
case rect :
tft.fillRect(buttonX + 1, buttonY + 1, buttonW - 2, buttonH - 2, buttonBackColor) ;
tft.drawRect(buttonX, buttonY, buttonW, buttonH, buttonBorderColor);
tft.setTextColor(buttonTextColor, buttonBackColor);
drawStringCenter(buttonText, 3);
break;
case roundrect :
tft.fillRoundRect(buttonX + 1, buttonY + 1, buttonW - 2, buttonH - 2, 5, buttonBackColor) ;
tft.drawRoundRect(buttonX, buttonY, buttonW, buttonH, 5, buttonBorderColor);
tft.setTextColor(buttonTextColor, buttonBackColor);
drawStringCenter(buttonText, 3);

break;
case circle :
tft.fillCircle(buttonX + 1, buttonY + 1, buttonW - 2, buttonBackColor) ;
tft.drawCircle(buttonX, buttonY, buttonW, buttonBorderColor);
tft.setTextColor(buttonTextColor, buttonBackColor);
drawStringCenter(buttonText, 3);
break;
}
}

bool button::pressed() {

}







#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

button myButton;
button myButton2;
button myButton3;


void setup() {
tft.begin();
tft.fillScreen(ILI9341_BLACK);




char Test[15] = "Test";
// put your setup code here, to run once:
Serial.begin(9600);
// void button::doinit(byte aNr, char *aText, byte aTextColor, byte aBackColor, tButtonType aType, int aX, int aY, int aW, int aH) {

myButton.doinit( Thetft, (byte) 0, Test, WHITE, GREEN, BLUE, rect , 10, 10, 100, 100);
myButton.draw();

myButton2.doinit(Thetft, (byte) 0, Test, WHITE, GREEN, BLUE, roundrect , 150, 10, 100, 100);
myButton2.draw();


myButton2.doinit(Thetft, (byte) 0, Test, WHITE, GREEN, BLUE, circle , 80, 80, 50, 50);
myButton2.draw();


}

void loop() {
// put your main code here, to run repeatedly:

}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: class doorgeven in een functie van een class

Berichtdoor nicoverduin » 25 Jan 2017, 21:16

Als ik het goed begrijp wil je dat in de button class een referentie kopieren van de tft class. Ik vermoed dat ie loopt te piepen omdat er geen copy operator is voor de class. Maar waarom geef je niet gewoon het adres van de tft door? En bewaar je de pointer in de button class. Je moet dan wel de tft. vervangen voor tft->
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

Re: class doorgeven in een functie van een class

Berichtdoor doebi » 25 Jan 2017, 22:05

@Nico , super , het werkt :)

Voor de geintresseerden (code met nog heel veel werk aan):

Code: Alles selecteren
#include <Adafruit_FT6206.h>
#include <Adafruit_ILI9341.h>
using namespace std;
#define TFT_CS 10
#define TFT_DC 9

// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 Thectp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
Adafruit_ILI9341 Thetft = Adafruit_ILI9341(TFT_CS, TFT_DC);



enum tButtonType {circle = 2, rect = 0, roundrect = 1} ;
enum tPressed {pressed, unpressed};

class button {
  public :
      byte buttonNr;
    Adafruit_ILI9341 *tft;
    tButtonType buttonType;
    char buttonText[15];
    int buttonTextColor;
    int buttonBackColor;
    int buttonBorderColor;
    int buttonX;
    int buttonY;
    int buttonW;
    int buttonH;
    void doinit(Adafruit_ILI9341 *aTFT, byte aNr, char *aText, int aTextColor, int aBackColor, int aBorderColor , tButtonType aType, int aX, int aY, int aW, int aH);
    void drawStringCenter(char *string, int8_t size);
    void draw();
    bool pressed();
} ;


void button::doinit(Adafruit_ILI9341 *aTFT, byte aNr, char *aText, int aTextColor, int aBackColor, int aBorderColor, tButtonType aType, int aX, int aY, int aW, int aH) {
  tft = aTFT;
  buttonX = aX;
  buttonY = aY;
  buttonW = aW;
  buttonH = aH;
  buttonType = aType;
  buttonTextColor = aTextColor;
  buttonBackColor = aBackColor;
  buttonBorderColor = aBorderColor;
  buttonNr = aNr;
  for (byte aLus = 0; aLus < 15; aLus++) {
    buttonText[aLus] = aText[aLus];
  }
}

void button::drawStringCenter(char *string, int8_t size)
{
  tft->setTextSize(size);
  tft->setCursor(buttonX + buttonW / 2 -  ( 5 * size * ( strlen(buttonText) / 2) ) , buttonY + buttonH / 2 - (7 * size / 2) );
  while (*string)
    tft->print( (char) *string++);

}


void button::draw() {

  switch (buttonType) {
    case rect :
      tft->fillRect(buttonX + 1, buttonY + 1, buttonW - 2, buttonH - 2, buttonBackColor) ;
      tft->drawRect(buttonX, buttonY, buttonW, buttonH, buttonBorderColor);
      tft->setTextColor(buttonTextColor, buttonBackColor);
      drawStringCenter(buttonText, 3);
      break;
    case roundrect :
      tft->fillRoundRect(buttonX + 1, buttonY + 1, buttonW - 2, buttonH - 2, 5, buttonBackColor) ;
      tft->drawRoundRect(buttonX, buttonY, buttonW, buttonH, 5, buttonBorderColor);
      tft->setTextColor(buttonTextColor, buttonBackColor);
      drawStringCenter(buttonText, 3);

      break;
    case circle :
      tft->fillCircle(buttonX + 1, buttonY + 1, buttonW - 2, buttonBackColor) ;
      tft->drawCircle(buttonX, buttonY, buttonW,  buttonBorderColor);
      tft->setTextColor(buttonTextColor, buttonBackColor);
      drawStringCenter(buttonText, 3);
      break;
  }
}

bool button::pressed() {

}







#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

button myButton;
button myButton2;
button myButton3;


void setup() {
  Thetft.begin();
  Thetft.fillScreen(ILI9341_BLACK);




  char Test[15] = "Test";
  // put your setup code here, to run once:
  Serial.begin(9600);
  //  void button::doinit(byte aNr, char *aText, byte aTextColor, byte aBackColor, tButtonType aType, int aX, int aY, int aW, int aH) {

  myButton.doinit( &Thetft, (byte) 0, Test,  WHITE,   GREEN,  BLUE, rect , 10, 10, 100, 100);
  myButton.draw();

  myButton2.doinit(&Thetft, (byte) 0, Test,  WHITE,   CYAN,  RED, roundrect , 120, 10, 100, 100);
  myButton2.draw();


  myButton2.doinit(&Thetft, (byte) 0, Test,  YELLOW,   MAGENTA,  GREEN, circle , 140, 180, 80, 50);
  myButton2.draw();


}

void loop() {
  // put your main code here, to run repeatedly:

}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: class doorgeven in een functie van een class

Berichtdoor nicoverduin » 25 Jan 2017, 22:54

Lijkt een beetje op oude windows architectuur :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

Re: class doorgeven in een functie van een class

Berichtdoor doebi » 26 Jan 2017, 21:16

@Nico, wordt aan gewerkt ;-)

Code nog wat aangepast,
werkt prima voor wat ik beoogde. Nogmaals bedankt.
Topic done :-)

Voor wie wil meekijken , onderstaande code maakt 3 soorten custumable (is that a word ?) button's aan op een touchscreen.

Code: Alles selecteren
#include <Adafruit_FT6206.h>
#include <Adafruit_ILI9341.h>
using namespace std;
#define TFT_CS 10
#define TFT_DC 9

// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 Thectp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
Adafruit_ILI9341 Thetft = Adafruit_ILI9341(TFT_CS, TFT_DC);



enum tButtonType {circle = 2, rect = 0, roundrect = 1} ;
enum tPressed {pressed = 1, unpressed = 0};

class button {
  public :
    /*    // The FT6206 uses hardware I2C (SCL/SDA)
        Adafruit_FT6206 ctp = Adafruit_FT6206();
        // The display also uses hardware SPI, plus #9 & #10
        Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
    */    byte buttonNr;
    Adafruit_ILI9341 *tft;
    tButtonType buttonType;
    char buttonText[15];
    int buttonTextColor;
    int buttonBackColor;
    int buttonBorderColor;
    int buttonX;
    int buttonY;
    int buttonW;
    int buttonH;
    void doinit(Adafruit_ILI9341 *aTFT, byte aNr, char *aText, int aTextColor, int aBackColor, int aBorderColor , tButtonType aType, int aX, int aY, int aW, int aH = 0);
    void drawStringCenter(char *string, int8_t size);
    void draw();
    bool click(TS_Point *p);
} ;


void button::doinit(Adafruit_ILI9341 *aTFT, byte aNr, char *aText, int aTextColor, int aBackColor, int aBorderColor, tButtonType aType, int aX, int aY, int aW, int aH = 0) {
  tft = aTFT;
  buttonX = aX;
  buttonY = aY;
  buttonW = aW;
  buttonH = aH;
  buttonType = aType;
  buttonTextColor = aTextColor;
  buttonBackColor = aBackColor;
  buttonBorderColor = aBorderColor;
  buttonNr = aNr;
  for (byte aLus = 0; aLus < 15; aLus++) {
    buttonText[aLus] = aText[aLus];
  }
}

void button::drawStringCenter(char *string, int8_t size)
{
  tft->setTextSize(size);

  switch (buttonType) {
    case rect :
      tft->setCursor(buttonX + buttonW / 2 -  ( 5 * size * ( strlen(buttonText) / 2) ) , buttonY + buttonH / 2 - (7 * size / 2) );
      break;
    case roundrect :
      tft->setCursor(buttonX + buttonW / 2 -  ( 5 * size * ( strlen(buttonText) / 2) ) , buttonY + buttonH / 2 - (7 * size / 2) );
      break;
    case circle :
      tft->setCursor(buttonX -  ( 5 * size * ( strlen(buttonText) / 2) ) , buttonY - (7 * size / 2) );
      break;
  }
  while (*string)
    tft->print( (char) *string++);

}


void button::draw() {

  switch (buttonType) {
    case rect :
      tft->fillRect(buttonX + 1, buttonY + 1, buttonW - 2, buttonH - 2, buttonBackColor) ;
      tft->drawRect(buttonX, buttonY, buttonW, buttonH, buttonBorderColor);
      tft->setTextColor(buttonTextColor, buttonBackColor);
      drawStringCenter(buttonText, 3);
      break;
    case roundrect :
      tft->fillRoundRect(buttonX + 1, buttonY + 1, buttonW - 2, buttonH - 2, 5, buttonBackColor) ;
      tft->drawRoundRect(buttonX, buttonY, buttonW, buttonH, 5, buttonBorderColor);
      tft->setTextColor(buttonTextColor, buttonBackColor);
      drawStringCenter(buttonText, 3);

      break;
    case circle :
      tft->fillCircle(buttonX, buttonY, buttonW - 1, buttonBackColor) ;
      tft->drawCircle(buttonX, buttonY, buttonW,  buttonBorderColor);
      tft->setTextColor(buttonTextColor, buttonBackColor);
      drawStringCenter(buttonText, 3);
      break;
  }
}

bool button::click(TS_Point *p) {
bool res = false;
  if (p->x >= buttonX) {
    if (p->x <= ( buttonX+buttonW) ) {
      if (p->y >= buttonY) {
        if (p->y <= (buttonY + buttonH) ) {
          res = true;
        }
      }
    }
  }
  return res;
}







#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

button myButton;
button myButton2;
button myButton3;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
 
  if (! Thectp.begin(40)) {  // pass in 'sensitivity' coefficient
    // Couldn't start FT6206 touchscreen controller"
    while (1);
  }
  else
  {
    Serial.print("Capacitive touchscreen started");
  }

  Thetft.begin();

  Thetft.setRotation(0);

 
  Thetft.fillScreen(ILI9341_BLACK);

 




  char Test[15] = "Test";
 
  //  void button::doinit(byte aNr, char *aText, byte aTextColor, byte aBackColor, tButtonType aType, int aX, int aY, int aW, int aH) {

  myButton.doinit( &Thetft, (byte) 0, Test,  WHITE,   GREEN,  BLUE, rect , 10, 10, 100, 100);
  myButton.draw();

  myButton2.doinit(&Thetft, (byte) 0, "Yes",  WHITE,   CYAN,  RED, roundrect , 120, 10, 100, 100);
  myButton2.draw();


  myButton3.doinit(&Thetft, (byte) 0, "Ok",  YELLOW,   MAGENTA,  GREEN, circle , 140, 200, 40);
  myButton3.draw();


}

void translateCTP2ILI(Adafruit_ILI9341 *aTFT,TS_Point *p ) {
// need to overwrite this function in function of the rotation of the TFT !!!!!!!!!!
  p->x = aTFT->width() - ( p->x);
  p->y = aTFT->height() - (p->y);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Thectp.touched() )
  {
    Serial.println("ok, we test");
    TS_Point p = Thectp.getPoint();
    translateCTP2ILI(&Thetft, &p);
    Serial.print("x = ");
    Serial.print(p.x);
    Serial.print(" y = ");
    Serial.println(p.y);
    if (myButton.click(&p) ) {
      Serial.println("Button");
    }
    if (myButton2.click(&p) ) {
      Serial.println("Button 2");
    }
    if (myButton3.click(&p) ) {
      Serial.println("Button 3");
    }
  }
}


Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten