10 years, 8 months ago.

Compiler error while porting Arduino library

I don't think you'll need to read all the code, it's just the first line (after the compiler stuff) that is giving the compiler error.

Error: Not a class or struct name in "Adafruit_GFX/Adafruit_GFX.h", Line: 10, Col: 29

#ifndef _ADAFRUIT_GFX_H
#define _ADAFRUIT_GFX_H

#include "mbed.h"
//#include "Arduino.h"
//#include "Print.h"

#define swap(a, b) { int16_t t = a; a = b; b = t; }

class Adafruit_GFX : public Print {                        // THIS LINE RIGHT HERE

 public:

  Adafruit_GFX(int16_t w, int16_t h); // Constructor

  // This MUST be defined by the subclass:
  virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;

  // These MAY be overridden by the subclass to provide device-specific
  // optimized code.  Otherwise 'generic' versions are used.
  virtual void
    drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
    drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
    drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
    drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
    fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
    fillScreen(uint16_t color),
    invertDisplay(bool i);

  // These exist only with Adafruit_GFX (no subclass overrides)
  void
    drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
    drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
      uint16_t color),
    fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
    fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
      int16_t delta, uint16_t color),
    drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
      int16_t x2, int16_t y2, uint16_t color),
    fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
      int16_t x2, int16_t y2, uint16_t color),
    drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
      int16_t radius, uint16_t color),
    fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
      int16_t radius, uint16_t color),
    drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
      int16_t w, int16_t h, uint16_t color),
    drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
      uint16_t bg, uint8_t size),
    setCursor(int16_t x, int16_t y),
    setTextColor(uint16_t c),
    setTextColor(uint16_t c, uint16_t bg),
    setTextSize(uint8_t s),
    setTextWrap(bool w),
    setRotation(uint8_t r);

#if ARDUINO >= 100
  virtual size_t write(uint8_t);
#else
  virtual void   write(uint8_t);
#endif

  int16_t
    height(void),
    width(void);

  uint8_t getRotation(void);

 protected:
  const int16_t
    WIDTH, HEIGHT;   // This is the 'raw' display w/h - never changes
  int16_t
    _width, _height, // Display w/h as modified by current rotation
    cursor_x, cursor_y;
  uint16_t
    textcolor, textbgcolor;
  uint8_t
    textsize,
    rotation;
  bool
    wrap; // If set, 'wrap' text at right edge of display
};

1 Answer

Tony Otis
poster
10 years, 8 months ago.

Ok so I figured its because I commented out Print.h from the Arduino library. Does mbed have a similar library?

Of course if I just import Arduino's Print.h, it will need 3 more files, which in turn will need 10 more files and so on...

Hello Tony Otis,

what does Print class define? That's the question. There's no print class as I am aware of, at least in mbed sources. Can be though ported by another user. Is this print class https://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/Print.h ?? If yes, just remoe that inheritance, printf will be retargeted to default uart on your board, should not cause any problems.

Regards,
0xc0170

posted by Martin Kojtal 05 Mar 2014

However then he can't use printf with his display ;).

On mbed the almost equivalent is probably Stream, it works without inhereting anything, but then you can't use [name].printf to write to your display. Only of course Stream requires different methods to write to the display:

Copy-pasting from one of my own what you need to implement:

    virtual int _putc(int c);
    virtual int _getc() {
        return 0;
    }

You need to implement getc and putc, since you cannot read from a display, _getc is implemented simply with return 0. I *think* _putc is the equivalent of write in that code. So you need to replace write everywhere with _putc, and it should work.

posted by Erik - 05 Mar 2014