#include <Arduino.h>
#include <GxEPD.h>
#include <GxIO/GxIO_SPI/GxIO_SPI.h>
#include <GxIO/GxIO.h>
#include <Wire.h>
#include <WiFi.h>
#include <GxGDEW0213Z16/GxGDEW0213Z16.h> // 2.13" b/w/r
#include <Fonts/FreeMonoBold9pt7b.h>
#include <Fonts/FreeMonoBold12pt7b.h>
// #include <Fonts/FreeMonoBold18pt7b.h>
// #include <Fonts/FreeMonoBold24pt7b.h>
// SPIClass fspi = SPIClass(FSPI);
GxIO_Class io(SPI, /*CS*/GPIO_NUM_34, /*DC*/GPIO_NUM_37, /*RST*/GPIO_NUM_11);
GxEPD_Class display(io, /*RST*/GPIO_NUM_11, /*BUSY*/GPIO_NUM_10 );
const uint myDisplayRotation = 1;
String mySerialReceivedData_Old = "";
// Display.Font muss gesetzt sein
String shortenToDisplay(String _myMessage)
{
if (_myMessage.length() > 0)
{
int16_t myTextX, myTextY;
uint16_t myTextWidth, myTextHeight;
uint16_t myTextMaxHeight;
// weil automatischer Zeilenumbruch auf virt. Display
display.getTextBounds("8ygF", 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextMaxHeight);
myTextMaxHeight++;
myTextMaxHeight++;
display.getTextBounds(_myMessage, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
while (myTextHeight > myTextMaxHeight)
{
if (_myMessage.length() > 0)
_myMessage.remove(_myMessage.length()-1,1);
else return("");
display.getTextBounds(_myMessage, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
}
}
return(_myMessage);
}
void drawAlert(String _Message1, String _Message2)
{
if ((_Message1.length() == 0) && (_Message2.length() == 0))
return;
uint16_t myTextPosX = 0;
uint16_t myTextPosY = 0;
int16_t myTextX, myTextY;
uint16_t myTextWidth, myTextHeight;
display.setRotation(myDisplayRotation);
display.fillScreen(GxEPD_RED);
display.setTextColor(GxEPD_WHITE);
if (_Message1.length() > 0)
{
display.setFont(&FreeMonoBold12pt7b);
_Message1 = shortenToDisplay(_Message1);
display.getTextBounds(_Message1, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
myTextPosX = ((display.width() - myTextWidth) / 2) - myTextX;
myTextPosY = ((display.height() - myTextHeight) / 2) - myTextY;
if (_Message2.length() > 0)
myTextPosY = myTextPosY - (myTextHeight/2);
display.setCursor(myTextPosX, myTextPosY);
display.print(_Message1.c_str());
}
if (_Message2.length() > 0)
{
display.setFont(&FreeMonoBold9pt7b);
_Message2 = shortenToDisplay(_Message2);
display.getTextBounds(_Message2, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
myTextPosX = ((display.width() - myTextWidth) / 2) - myTextX;
display.setCursor(myTextPosX, (display.height()-myTextHeight));
display.print(_Message2.c_str());
}
}
void drawUrgent(String _Message1, String _Message2)
{
if ((_Message1.length() == 0) && (_Message2.length() == 0))
return;
uint16_t myTextPosX = 0;
uint16_t myTextPosY = 0;
int16_t myTextX, myTextY;
uint16_t myTextWidth, myTextHeight;
display.setRotation(myDisplayRotation);
display.fillScreen(GxEPD_WHITE);
display.setTextColor(GxEPD_RED);
if (_Message1.length() > 0)
{
display.setFont(&FreeMonoBold12pt7b);
_Message1 = shortenToDisplay(_Message1);
display.getTextBounds(_Message1, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
myTextPosX = ((display.width() - myTextWidth) / 2) - myTextX;
myTextPosY = ((display.height() - myTextHeight) / 2) - myTextY;
if (_Message2.length() > 0)
myTextPosY = myTextPosY - (myTextHeight/2);
display.setCursor(myTextPosX, myTextPosY);
display.print(_Message1.c_str());
}
if (_Message2.length() > 0)
{
display.setFont(&FreeMonoBold9pt7b);
_Message2 = shortenToDisplay(_Message2);
display.getTextBounds(_Message2, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
myTextPosX = ((display.width() - myTextWidth) / 2) - myTextX;
display.setCursor(myTextPosX, (display.height()-myTextHeight));
display.print(_Message2.c_str());
}
}
void drawInfo(String _Message1, String _Message2)
{
if ((_Message1.length() == 0) && (_Message2.length() == 0))
return;
uint16_t myTextPosX = 0;
uint16_t myTextPosY = 0;
int16_t myTextX, myTextY;
uint16_t myTextWidth, myTextHeight;
display.setRotation(myDisplayRotation);
display.fillScreen(GxEPD_BLACK);
display.setTextColor(GxEPD_WHITE);
if (_Message1.length() > 0)
{
display.setFont(&FreeMonoBold12pt7b);
_Message1 = shortenToDisplay(_Message1);
display.getTextBounds(_Message1, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
myTextPosX = ((display.width() - myTextWidth) / 2) - myTextX;
myTextPosY = ((display.height() - myTextHeight) / 2) - myTextY;
if (_Message2.length() > 0)
myTextPosY = myTextPosY - (myTextHeight/2);
display.setCursor(myTextPosX, myTextPosY);
display.print(_Message1.c_str());
}
if (_Message2.length() > 0)
{
display.setFont(&FreeMonoBold9pt7b);
_Message2 = shortenToDisplay(_Message2);
display.getTextBounds(_Message2, 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
myTextPosX = ((display.width() - myTextWidth) / 2) - myTextX;
display.setCursor(myTextPosX, (display.height()-myTextHeight));
display.print(_Message2.c_str());
}
}
void drawStatus(String _Message1, String _Message2, String _Message3, String _Message4)
{
display.setRotation(myDisplayRotation);
display.setTextColor(GxEPD_BLACK);
display.fillScreen(GxEPD_WHITE);
display.setFont(&FreeMonoBold9pt7b);
_Message1 = shortenToDisplay(_Message1);
_Message2 = shortenToDisplay(_Message2);
_Message3 = shortenToDisplay(_Message3);
_Message4 = shortenToDisplay(_Message4);
uint16_t myTextPosX = 0;
uint16_t myTextPosY = 0;
int16_t myTextX, myTextY;
uint16_t myTextWidth, myTextHeight;
display.getTextBounds("8ygF", 0, 0, &myTextX, &myTextY, &myTextWidth, &myTextHeight);
uint16_t myYPosAdd = (display.height()-5) / 4;
if (_Message1.length() > 0)
{
display.setCursor(0, myYPosAdd);
display.print(_Message1.c_str());
}
if (_Message2.length() > 0)
{
display.setCursor(0, myYPosAdd*2);
display.print(_Message2.c_str());
}
if (_Message3.length() > 0)
{
display.setCursor(0, myYPosAdd*3);
display.print(_Message3.c_str());
}
if (_Message4.length() > 0)
{
display.setCursor(0, myYPosAdd*4);
display.print(_Message4.c_str());
}
}
String getSubString(String _myString, String _mySeparator, uint8_t _myPos)
{
int16_t LastPos = 0;
String myResultString = "";
for (int i=0; i < _myPos; i++)
{
LastPos = _myString.indexOf(_mySeparator, LastPos);
if (LastPos < 0)
return(myResultString);
LastPos = LastPos + _mySeparator.length();
}
if (LastPos >= 0)
{
myResultString = _myString.substring(LastPos);
if (myResultString.indexOf(_mySeparator) > -1)
return(myResultString.substring(0, myResultString.indexOf(_mySeparator)));
else return(myResultString);
}
else return (myResultString);
}
void setup()
{
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
setCpuFrequencyMhz(80);
Serial.begin(115200);
display.init();
drawInfo("STARTE...","");
display.update();
display.powerDown();
}
void loop()
{
String myReceivedSerialData = "";
while (Serial.available())
{
myReceivedSerialData = Serial.readStringUntil('\r');
if (myReceivedSerialData == nullptr) return;
if (myReceivedSerialData.length() < 5) return;
if (myReceivedSerialData == mySerialReceivedData_Old) return;
String myStatusMessageLine1 = "";
String myStatusMessageLine2 = "";
String myStatusMessageLine3 = "";
String myStatusMessageLine4 = "";
if (myReceivedSerialData.startsWith("[ALERT]"))
{
mySerialReceivedData_Old = myReceivedSerialData;
myReceivedSerialData.remove(0, 7);
if (myReceivedSerialData.indexOf("[NEWLINE]") >= 0)
{
myStatusMessageLine2 = myReceivedSerialData.substring(myReceivedSerialData.indexOf("[NEWLINE]")+9);
myStatusMessageLine1 = myReceivedSerialData.substring(0, myReceivedSerialData.indexOf("[NEWLINE]"));
}
else myStatusMessageLine1 = myReceivedSerialData;
drawAlert(myStatusMessageLine1, myStatusMessageLine2);
display.update();
}
else if (myReceivedSerialData.startsWith("[INFO]"))
{
mySerialReceivedData_Old = myReceivedSerialData;
myReceivedSerialData.remove(0, 6);
if (myReceivedSerialData.indexOf("[NEWLINE]") >= 0)
{
myStatusMessageLine2 = myReceivedSerialData.substring(myReceivedSerialData.indexOf("[NEWLINE]")+9);
myStatusMessageLine1 = myReceivedSerialData.substring(0, myReceivedSerialData.indexOf("[NEWLINE]"));
}
else myStatusMessageLine1 = myReceivedSerialData;
drawInfo(myStatusMessageLine1, myStatusMessageLine2);
display.update();
}
else if (myReceivedSerialData.startsWith("[URGENT]"))
{
mySerialReceivedData_Old = myReceivedSerialData;
myReceivedSerialData.remove(0, 8);
if (myReceivedSerialData.indexOf("[NEWLINE]") >= 0)
{
myStatusMessageLine2 = myReceivedSerialData.substring(myReceivedSerialData.indexOf("[NEWLINE]")+9);
myStatusMessageLine1 = myReceivedSerialData.substring(0, myReceivedSerialData.indexOf("[NEWLINE]"));
}
else myStatusMessageLine1 = myReceivedSerialData;
drawUrgent(myStatusMessageLine1, myStatusMessageLine2);
display.update();
}
else if (myReceivedSerialData.startsWith("[STATUS]"))
{
mySerialReceivedData_Old = myReceivedSerialData;
myReceivedSerialData.remove(0,8);
myStatusMessageLine1 = getSubString(myReceivedSerialData, "[NEWLINE]", 0);
myStatusMessageLine2 = getSubString(myReceivedSerialData, "[NEWLINE]", 1);
myStatusMessageLine3 = getSubString(myReceivedSerialData, "[NEWLINE]", 2);
myStatusMessageLine4 = getSubString(myReceivedSerialData, "[NEWLINE]", 3);
drawStatus(myStatusMessageLine1, myStatusMessageLine2, myStatusMessageLine3, myStatusMessageLine4);
display.update();
}
display.powerDown();
}
};