Files
ESP8266lib/ext/e-ink/Waveshare.h

107 lines
2.1 KiB
C++

#ifndef E_INK_WAVESHARE
#define E_INK_WAVESHARE
#include <cstdint>
#include "../../Debug.h"
#ifndef usleep
void usleep(int val) {
vTaskDelay(val / 1000 / portTICK_PERIOD_MS);
}
#endif
/**
* 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) {
Log::addInfo(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() {
Log::addInfo(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() {
Log::addInfo(NAME, "waitUntilIdle()");
while(MyGPIO::get(PIN_BUSY) == 0) {usleep(200*1000);}
Log::addInfo(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