Home > Net >  Arduino library error: use of deleted function
Arduino library error: use of deleted function

Time:09-27

I'm writing a library for Arduino. This library has to use the existing TFT_eSPI library. When I try to compile the following I get

/.../sketch/src/Display/Display.cpp: In static member function 'static void Display::begin()': /.../sketch/src/Display/Display.cpp:16:9: error: use of deleted function 'TFT_eSPI& TFT_eSPI::operator=(TFT_eSPI&&)' tft = TFT_eSPI(); ^ In file included from /.../sketch/src/Display/Display.h:12:0, from /.../sketch/src/Display/Display.cpp:9: /Users/luigisc/Documents/Arduino/libraries/TFT_eSPI/TFT_eSPI.h:359:7: note: 'TFT_eSPI& TFT_eSPI::operator=(TFT_eSPI&&)' is implicitly deleted because the default definition would be ill-formed: class TFT_eSPI : public Print { ^ /Users/luigisc/Documents/Arduino/libraries/TFT_eSPI/TFT_eSPI.h:359:7: error: non-static reference member 'fs::FS& TFT_eSPI::fontFS', can't use default assignment operator

Display.cpp

#include "Arduino.h"
#include "Display.h"

/*Global objects' declaration and initialization*/

void Display::begin(){
    //Display initializing
    tft = TFT_eSPI();

    tft.fillScreen(TFT_BLACK);
    tft.setTextColor(TFT_WHITE);
    tft.setTextSize(2);
    tft.setRotation(1);

}

// PRIVATE FUNCTIONS

void Display::drawGIF(GIFDRAW *pDraw){
    uint8_t *s;
    uint16_t *d, *usPalette, usTemp[320];
    int x, y, iWidth;

    iWidth = pDraw->iWidth;
    if (iWidth > tft.width())
        iWidth = tft.width();
    usPalette = pDraw->pPalette;
    y = pDraw->iY   pDraw->y; // current line

    s = pDraw->pPixels;
    if (pDraw->ucDisposalMethod == 2) // restore to background color
    {
        for (x=0; x<iWidth; x  )
        {
            if (s[x] == pDraw->ucTransparent)
                s[x] = pDraw->ucBackground;
        }
        pDraw->ucHasTransparency = 0;
    }
    // Apply the new pixels to the main image
    if (pDraw->ucHasTransparency) // if transparency used
    {
        uint8_t *pEnd, c, ucTransparent = pDraw->ucTransparent;
        int x, iCount;
        pEnd = s   iWidth;
        x = 0;
        iCount = 0; // count non-transparent pixels
        while(x < iWidth)
        {
            c = ucTransparent-1;
            d = usTemp;
            while (c != ucTransparent && s < pEnd)
            {
                c = *s  ;
                if (c == ucTransparent) // done, stop
                {
                    s--; // back up to treat it like transparent
                }
                else // opaque
                {
                    *d   = usPalette[c];
                    iCount  ;
                }
            } // while looking for opaque pixels
            if (iCount) // any opaque pixels?
            {
                tft.setAddrWindow(pDraw->iX x, y, iCount, 1);
                tft.startWrite();
                tft.pushPixels(usTemp, iCount);
                tft.endWrite();
                x  = iCount;
                iCount = 0;
            }
            // no, look for a run of transparent pixels
            c = ucTransparent;
            while (c == ucTransparent && s < pEnd)
            {
                c = *s  ;
                if (c == ucTransparent)
                    iCount  ;
                else
                    s--;
            }
            if (iCount)
            {
                x  = iCount; // skip these
                iCount = 0;
            }
        }
    }
    else
    {
        s = pDraw->pPixels;
        // Translate the 8-bit pixels through the RGB565 palette (already byte reversed)
        for (x=0; x<iWidth; x  )
            usTemp[x] = usPalette[*s  ];
        tft.setAddrWindow(pDraw->iX, y, iWidth, 1);
        tft.startWrite();
        tft.pushPixels(usTemp, iWidth);
        tft.endWrite();
    }
}

// PUBLIC FUNCTIONS

void Display::displayGIF(const uint8_t *gif_file, int gif_size, int nTimes){

    if (gif.open((uint8_t *)gif_file, gif_size, drawGIF)){

        for(int i=0;i<nTimes;i  ){
            gif.playFrame(true, NULL);
            while(gif.playFrame(true, NULL)){}
        }

        gif.close();

    }else{
        tft.fillScreen(TFT_BLACK);
        tft.setTextColor(TFT_WHITE);
        tft.setTextSize(2);
        tft.drawString("ERR: Can't load GIF", 0, tft.width()/2);
    }

}   

Display.h

#ifndef DISPLAY_H
#define DISPLAY_H

#include "Arduino.h"
#include <TFT_eSPI.h>
#include <AnimatedGIF.h>

class Display {

  public:
    static void begin();
    static void displayGIF(const uint8_t *gif_file, int gif_size, int nTimes);

  private:
    static void drawGIF(GIFDRAW *pDraw);
    static AnimatedGIF gif;
    static TFT_eSPI tft;

};

#endif

Edit

I reported all the code, also the function drawGif that need to be static.

CodePudding user response:

It seems like the TFT_eSPI instance doesn't belong in your Display class at all. You seem to use Display similar to a namespace since it only has static members (both variables and functions).

If you only want one single TFT_eSPI instance everywhere, you could create a free function returning a TFT_eSPI& to that one instance. Example:

Display.h

class Display {
    // static TFT_eSPI tft; // remove this
};

TFT_eSPI& tft();            // add a declaration of a free function

Display.cpp

void Display::begin(){
    //Display initializing
    //tft = TFT_eSPI();     // remove this
}

TFT_eSPI& tft() {           // add definition of the free function
    static TFT_eSPI instance;
    return instance;
}

Then in all places where you now do tft.something() you instead do tft().something(). The AnimatedGIF instance could be handled the same way.

Display could also be made into namespace Display and all the current member functions could be made into free functions in that namespace since Display does not keep any internal state.

  • Related