added code for a waveshare eInk refactored some old code to match with the new SoftI2C
103 lines
2.0 KiB
C++
103 lines
2.0 KiB
C++
#ifndef E_INK_WAVESHARE
|
|
#define E_INK_WAVESHARE
|
|
|
|
#include <cstdint>
|
|
#include "../../Debug.h"
|
|
|
|
|
|
|
|
|
|
/**
|
|
* base-class for Waveshare SPI E-Ink displays
|
|
* subclasses for every display type implement the actual methods
|
|
*/
|
|
template <int PIN_CS, int PIN_BUSY, int PIN_RST, int PIN_DC, typename SPI> class Waveshare {
|
|
|
|
static constexpr const char* NAME = "E-Ink";
|
|
|
|
SPI& spi;
|
|
|
|
public:
|
|
|
|
Waveshare(SPI& spi) : spi(spi) {
|
|
debugMod4(NAME, "ctor() CS:%d BUSY:%d RST:%d DC:%d", PIN_CS, PIN_BUSY, PIN_RST, PIN_DC);
|
|
MyGPIO::setInput(PIN_BUSY);
|
|
MyGPIO::setOutput(PIN_RST);
|
|
MyGPIO::setOutput(PIN_DC);
|
|
MyGPIO::setOutput(PIN_CS);
|
|
}
|
|
|
|
protected:
|
|
|
|
void reset() {
|
|
debugMod(NAME, "reset()");
|
|
MyGPIO::clear(PIN_RST);
|
|
usleep(200*1000);
|
|
MyGPIO::set(PIN_RST);
|
|
usleep(200*1000);
|
|
}
|
|
|
|
void sendCommand(uint8_t command) {
|
|
MyGPIO::clear(PIN_DC);
|
|
transfer(command);
|
|
}
|
|
|
|
void sendData(uint8_t data) {
|
|
MyGPIO::set(PIN_DC);
|
|
transfer(data);
|
|
}
|
|
|
|
void transfer(uint8_t data) {
|
|
MyGPIO::clear(PIN_CS); // select
|
|
spi.writeByte(data);
|
|
MyGPIO::clear(PIN_CS); // unselect
|
|
}
|
|
|
|
void waitUntilIdle() {
|
|
debugMod(NAME, "waitUntilIdle()");
|
|
while(MyGPIO::get(PIN_BUSY) == 0) {usleep(200*1000);}
|
|
debugMod(NAME, "OK");
|
|
}
|
|
|
|
void lut(uint8_t c, uint8_t l, const uint8_t* p) {
|
|
sendCommand(c);
|
|
for (int i = 0; i < l; i++, p++) {
|
|
sendData(*p);
|
|
}
|
|
}
|
|
|
|
void send1(uint8_t cmd, uint8_t v1) {
|
|
sendCommand(cmd);
|
|
sendData(v1);
|
|
}
|
|
void send2(uint8_t cmd, uint8_t v1, uint8_t v2) {
|
|
sendCommand(cmd);
|
|
sendData(v1);
|
|
sendData(v2);
|
|
}
|
|
void send3(uint8_t cmd, uint8_t v1, uint8_t v2, uint8_t v3) {
|
|
sendCommand(cmd);
|
|
sendData(v1);
|
|
sendData(v2);
|
|
sendData(v3);
|
|
}
|
|
void send4(uint8_t cmd, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4) {
|
|
sendCommand(cmd);
|
|
sendData(v1);
|
|
sendData(v2);
|
|
sendData(v3);
|
|
sendData(v4);
|
|
}
|
|
void send5(uint8_t cmd, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5) {
|
|
sendCommand(cmd);
|
|
sendData(v1);
|
|
sendData(v2);
|
|
sendData(v3);
|
|
sendData(v4);
|
|
sendData(v5);
|
|
}
|
|
|
|
};
|
|
|
|
#endif // E_INK_WAVESHARE
|