#ifndef E_INK_WAVESHARE #define E_INK_WAVESHARE #include #include "../../Debug.h" /** * base-class for Waveshare SPI E-Ink displays * subclasses for every display type implement the actual methods */ template 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