|
@@ -2,20 +2,58 @@
|
|
|
|
|
|
|
|
#include "../../MeshCore.h"
|
|
#include "../../MeshCore.h"
|
|
|
|
|
|
|
|
|
|
+BaseDisplay* E213Display::detectEInk()
|
|
|
|
|
+{
|
|
|
|
|
+ // Test 1: Logic of BUSY pin
|
|
|
|
|
+
|
|
|
|
|
+ // Determines controller IC manufacturer
|
|
|
|
|
+ // Fitipower: busy when LOW
|
|
|
|
|
+ // Solomon Systech: busy when HIGH
|
|
|
|
|
+
|
|
|
|
|
+ // Force display BUSY by holding reset pin active
|
|
|
|
|
+ pinMode(DISP_RST, OUTPUT);
|
|
|
|
|
+ digitalWrite(DISP_RST, LOW);
|
|
|
|
|
+
|
|
|
|
|
+ delay(10);
|
|
|
|
|
+
|
|
|
|
|
+ // Read whether pin is HIGH or LOW while busy
|
|
|
|
|
+ pinMode(DISP_BUSY, INPUT);
|
|
|
|
|
+ bool busyLogic = digitalRead(DISP_BUSY);
|
|
|
|
|
+
|
|
|
|
|
+ // Test complete. Release pin
|
|
|
|
|
+ pinMode(DISP_RST, INPUT);
|
|
|
|
|
+
|
|
|
|
|
+ if (busyLogic == LOW) {
|
|
|
|
|
+#ifdef VISION_MASTER_E213
|
|
|
|
|
+ return new EInkDisplay_VisionMasterE213 ;
|
|
|
|
|
+#else
|
|
|
|
|
+ return new EInkDisplay_WirelessPaperV1_1 ;
|
|
|
|
|
+#endif
|
|
|
|
|
+ } else {// busy HIGH
|
|
|
|
|
+#ifdef VISION_MASTER_E213
|
|
|
|
|
+ return new EInkDisplay_VisionMasterE213V1_1 ;
|
|
|
|
|
+#else
|
|
|
|
|
+ return new EInkDisplay_WirelessPaperV1_1_1 ;
|
|
|
|
|
+#endif
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool E213Display::begin() {
|
|
bool E213Display::begin() {
|
|
|
if (_init) return true;
|
|
if (_init) return true;
|
|
|
|
|
|
|
|
powerOn();
|
|
powerOn();
|
|
|
- display.begin();
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if(display==NULL) {
|
|
|
|
|
+ display = detectEInk();
|
|
|
|
|
+ }
|
|
|
|
|
+ display->begin();
|
|
|
// Set to landscape mode rotated 180 degrees
|
|
// Set to landscape mode rotated 180 degrees
|
|
|
- display.setRotation(3);
|
|
|
|
|
|
|
+ display->setRotation(3);
|
|
|
|
|
|
|
|
_init = true;
|
|
_init = true;
|
|
|
_isOn = true;
|
|
_isOn = true;
|
|
|
|
|
|
|
|
clear();
|
|
clear();
|
|
|
- display.fastmodeOn(); // Enable fast mode for quicker (partial) updates
|
|
|
|
|
|
|
+ display->fastmodeOn(); // Enable fast mode for quicker (partial) updates
|
|
|
|
|
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
@@ -23,15 +61,23 @@ bool E213Display::begin() {
|
|
|
void E213Display::powerOn() {
|
|
void E213Display::powerOn() {
|
|
|
#ifdef PIN_VEXT_EN
|
|
#ifdef PIN_VEXT_EN
|
|
|
pinMode(PIN_VEXT_EN, OUTPUT);
|
|
pinMode(PIN_VEXT_EN, OUTPUT);
|
|
|
|
|
+#ifdef PIN_VEXT_EN_ACTIVE
|
|
|
|
|
+ digitalWrite(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE);
|
|
|
|
|
+#else
|
|
|
digitalWrite(PIN_VEXT_EN, LOW); // Active low
|
|
digitalWrite(PIN_VEXT_EN, LOW); // Active low
|
|
|
|
|
+#endif
|
|
|
delay(50); // Allow power to stabilize
|
|
delay(50); // Allow power to stabilize
|
|
|
#endif
|
|
#endif
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::powerOff() {
|
|
void E213Display::powerOff() {
|
|
|
#ifdef PIN_VEXT_EN
|
|
#ifdef PIN_VEXT_EN
|
|
|
|
|
+#ifdef PIN_VEXT_EN_ACTIVE
|
|
|
|
|
+ digitalWrite(PIN_VEXT_EN, !PIN_VEXT_EN_ACTIVE);
|
|
|
|
|
+#else
|
|
|
digitalWrite(PIN_VEXT_EN, HIGH); // Turn off power
|
|
digitalWrite(PIN_VEXT_EN, HIGH); // Turn off power
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+#endif
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::turnOn() {
|
|
void E213Display::turnOn() {
|
|
@@ -46,21 +92,23 @@ void E213Display::turnOff() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::clear() {
|
|
void E213Display::clear() {
|
|
|
- display.clear();
|
|
|
|
|
|
|
+ display->clear();
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::startFrame(Color bkg) {
|
|
void E213Display::startFrame(Color bkg) {
|
|
|
// Fill screen with white first to ensure clean background
|
|
// Fill screen with white first to ensure clean background
|
|
|
- display.fillRect(0, 0, width(), height(), WHITE);
|
|
|
|
|
|
|
+ display->fillRect(0, 0, width(), height(), WHITE);
|
|
|
|
|
+
|
|
|
if (bkg == LIGHT) {
|
|
if (bkg == LIGHT) {
|
|
|
// Fill with black if light background requested (inverted for e-ink)
|
|
// Fill with black if light background requested (inverted for e-ink)
|
|
|
- display.fillRect(0, 0, width(), height(), BLACK);
|
|
|
|
|
|
|
+ display->fillRect(0, 0, width(), height(), BLACK);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::setTextSize(int sz) {
|
|
void E213Display::setTextSize(int sz) {
|
|
|
// The library handles text size internally
|
|
// The library handles text size internally
|
|
|
- display.setTextSize(sz);
|
|
|
|
|
|
|
+ display->setTextSize(sz);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::setColor(Color c) {
|
|
void E213Display::setColor(Color c) {
|
|
@@ -68,19 +116,19 @@ void E213Display::setColor(Color c) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::setCursor(int x, int y) {
|
|
void E213Display::setCursor(int x, int y) {
|
|
|
- display.setCursor(x, y);
|
|
|
|
|
|
|
+ display->setCursor(x, y);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::print(const char *str) {
|
|
void E213Display::print(const char *str) {
|
|
|
- display.print(str);
|
|
|
|
|
|
|
+ display->print(str);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::fillRect(int x, int y, int w, int h) {
|
|
void E213Display::fillRect(int x, int y, int w, int h) {
|
|
|
- display.fillRect(x, y, w, h, BLACK);
|
|
|
|
|
|
|
+ display->fillRect(x, y, w, h, BLACK);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::drawRect(int x, int y, int w, int h) {
|
|
void E213Display::drawRect(int x, int y, int w, int h) {
|
|
|
- display.drawRect(x, y, w, h, BLACK);
|
|
|
|
|
|
|
+ display->drawRect(x, y, w, h, BLACK);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::drawXbm(int x, int y, const uint8_t *bits, int w, int h) {
|
|
void E213Display::drawXbm(int x, int y, const uint8_t *bits, int w, int h) {
|
|
@@ -98,7 +146,7 @@ void E213Display::drawXbm(int x, int y, const uint8_t *bits, int w, int h) {
|
|
|
|
|
|
|
|
// If the bit is set, draw the pixel
|
|
// If the bit is set, draw the pixel
|
|
|
if (bitSet) {
|
|
if (bitSet) {
|
|
|
- display.drawPixel(x + bx, y + by, BLACK);
|
|
|
|
|
|
|
+ display->drawPixel(x + bx, y + by, BLACK);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -107,10 +155,10 @@ void E213Display::drawXbm(int x, int y, const uint8_t *bits, int w, int h) {
|
|
|
uint16_t E213Display::getTextWidth(const char *str) {
|
|
uint16_t E213Display::getTextWidth(const char *str) {
|
|
|
int16_t x1, y1;
|
|
int16_t x1, y1;
|
|
|
uint16_t w, h;
|
|
uint16_t w, h;
|
|
|
- display.getTextBounds(str, 0, 0, &x1, &y1, &w, &h);
|
|
|
|
|
|
|
+ display->getTextBounds(str, 0, 0, &x1, &y1, &w, &h);
|
|
|
return w;
|
|
return w;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void E213Display::endFrame() {
|
|
void E213Display::endFrame() {
|
|
|
- display.update();
|
|
|
|
|
|
|
+ display->update();
|
|
|
}
|
|
}
|