fixed some issue with SoftI2C not working (missing delay)
added code for a waveshare eInk refactored some old code to match with the new SoftI2C
This commit is contained in:
102
ext/e-ink/Waveshare.h
Normal file
102
ext/e-ink/Waveshare.h
Normal file
@@ -0,0 +1,102 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user