Hi Bodmer,
These are very welcome news!
Seems we are on a similar track, but I am still a beginner in this field.
My design has evolved a bit:
#ifndef _GxIO_H_
#define _GxIO_H_
#include <Arduino.h>
#include <SPI.h>
class GxIO
{
public:
GxIO() {};
const char* name = "GxIO";
virtual void reset();
virtual void init();
virtual uint8_t transferTransaction(uint8_t d);
virtual uint16_t transfer16Transaction(uint16_t d);
virtual uint8_t readDataTransaction()
{
return 0;
};
virtual uint16_t readData16Transaction()
{
return 0;
};
virtual void writeCommandTransaction(uint8_t c);
virtual void writeDataTransaction(uint8_t d);
virtual void writeData16Transaction(uint16_t d, uint32_t num = 1);
virtual void writeCommand(uint8_t c);
virtual void writeData(uint8_t d);
virtual void writeData(uint8_t* d, uint32_t num);
virtual void writeData16(uint16_t d, uint32_t num = 1);
virtual void writeAddrMSBfirst(uint16_t d);
virtual void startTransaction();
virtual void endTransaction();
virtual void setBackLight(bool lit);
};
#if defined(__AVR) || defined(ESP8266)
class GxIO_SPI : public GxIO
{
public:
GxIO_SPI(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1, int8_t bl = -1);
const char* name = "GxIO_SPI";
void reset();
void init();
uint8_t transferTransaction(uint8_t d);
uint16_t transfer16Transaction(uint16_t d);
uint8_t readDataTransaction();
uint16_t readData16Transaction();
void writeCommandTransaction(uint8_t c);
void writeDataTransaction(uint8_t d);
void writeData16Transaction(uint16_t d, uint32_t num = 1);
void writeCommand(uint8_t c);
void writeData(uint8_t d);
void writeData(uint8_t* d, uint32_t num);
void writeData16(uint16_t d, uint32_t num = 1);
void writeAddrMSBfirst(uint16_t d);
void startTransaction();
void endTransaction();
void setBackLight(bool lit);
protected:
SPIClass& _SPI;
int8_t _cs, _dc, _rst, _bl; // Control lines
};
class GxIO_SPI3W : public GxIO
{
public:
GxIO_SPI3W(SPIClass& spi, int8_t cs, int8_t dc, int8_t rst = -1, int8_t bl = -1,
// defaults are for RA8875
uint8_t cmd_read = 0xC0, uint8_t data_read = 0x40, uint8_t cmd_write = 0x80, uint8_t data_write = 0x00);
const char* name = "GxIO_SPI3W";
void reset();
void init();
uint8_t transferTransaction(uint8_t d);
uint16_t transfer16Transaction(uint16_t d);
uint8_t readDataTransaction();
uint16_t readData16Transaction();
void writeCommandTransaction(uint8_t c);
void writeDataTransaction(uint8_t d);
void writeData16Transaction(uint16_t d, uint32_t num = 1);
void writeCommand(uint8_t c);
void writeData(uint8_t d);
void writeData(uint8_t* d, uint32_t num);
void writeData16(uint16_t d, uint32_t num = 1);
void writeAddrMSBfirst(uint16_t d);
void startTransaction();
void endTransaction();
void setBackLight(bool lit);
protected:
SPIClass& _SPI;
uint8_t _cmd_read, _data_read, _cmd_write, _data_write;
int8_t _cs, _dc, _rst, _bl; // Control lines
};
and
// GxCTRL.h
#ifndef _GxCTRL_H_
#define _GxCTRL_H_
#include "GxIO.h"
class GxCTRL
{
public:
GxCTRL(GxIO& io) : IO(io) {};
const char* name = "GxCTRL";
virtual void init();
virtual void setWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
virtual void setRotation(uint8_t r);
virtual void invertDisplay(boolean i) {IO.writeCommandTransaction(i ? 0x21 : 0x20);};
protected:
GxIO& IO;
};
But for RA8875 the separation of display class and controller class not really makes sense.
Jean-Marc