532 Zeilen
23 KiB
C
532 Zeilen
23 KiB
C
//--------------------------------------------------------------
|
|
/*
|
|
additional OLED Display 128x64 for Z21PG
|
|
|
|
- show system info
|
|
- show power status
|
|
- display IP Address
|
|
- show system information
|
|
- default Display Driver SSD1306 0.96"
|
|
- add second Display Driver SH1106 for 1.3"
|
|
- add logos for different power mode
|
|
- animate the CV progress
|
|
|
|
Copyright (c) by Philipp Gahtow, year 2022
|
|
*/
|
|
#if defined(Z21DISPLAY)
|
|
|
|
//--------------------------------------------------------------
|
|
#include <SPI.h>
|
|
#include <Wire.h>
|
|
#include <Adafruit_GFX.h>
|
|
|
|
#define SCREEN_WIDTH 128 // OLED display width, in pixels
|
|
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
|
|
|
|
#ifndef Z21DISPLAY_CONTRAST
|
|
#define Z21DISPLAY_CONTRAST 20 //reduce the contrast for a longer lifetime (0..255)
|
|
#endif
|
|
|
|
#ifndef AMP_DECIMALS
|
|
#define AMP_DECIMALS 2 // OLED decimal digits of precision for Amper on the Rail (x.xxA)
|
|
#endif
|
|
|
|
#define DISPLAY_POWER_LOGO 300 // x * 255 = ms time after config data will be removed in csNormal!
|
|
|
|
//--------------------------------------------------------------
|
|
static const unsigned char Z21Bitmap [] PROGMEM = {
|
|
// Z21 Logo, 80x37px
|
|
0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x0f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x01, 0xfe, 0x0f, 0xff, 0xff, 0x01, 0xff, 0xe0,
|
|
0x00, 0x00, 0x03, 0xfc, 0x0f, 0xff, 0xff, 0xc1, 0xff, 0xe0,
|
|
0x00, 0x00, 0x07, 0xfc, 0x1f, 0xff, 0xff, 0xe1, 0xff, 0xe0,
|
|
0x00, 0x00, 0x0f, 0xf8, 0x1f, 0xff, 0xff, 0xe1, 0xff, 0xe0,
|
|
0x00, 0x00, 0x1f, 0xf0, 0x1f, 0xff, 0xff, 0xf1, 0xff, 0xe0,
|
|
0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x07, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x07, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x07, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x0f, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xf0, 0x0f, 0xe0,
|
|
0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x0f, 0xe0,
|
|
0x00, 0x1f, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xe0,
|
|
0x00, 0x3f, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0xc0, 0x0f, 0xe0,
|
|
0x00, 0x7f, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x0f, 0xe0,
|
|
0x00, 0xff, 0x80, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x00, 0xff, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x01, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x03, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x07, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x07, 0xf8, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x07, 0xf0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x0f, 0xe0,
|
|
0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xcf, 0xe0,
|
|
0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xcf, 0xe0,
|
|
0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xcf, 0xe0,
|
|
0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xcf, 0xe0,
|
|
0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xcf, 0xe0
|
|
};
|
|
//--------------------------------------------------------------
|
|
static const unsigned char Power_PROG [] PROGMEM =
|
|
//imageWidth 25, imageHeight 36
|
|
{ 0x00, 0x22, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf0, 0x00,
|
|
0x3f, 0x80, 0xfe, 0x00, 0x3f, 0x80, 0xff, 0x00, 0x3f, 0x80, 0xff, 0x00, 0x7f, 0xff, 0xff, 0x00,
|
|
0x70, 0x00, 0x07, 0x00, 0x60, 0xe6, 0x63, 0x00, 0x61, 0x96, 0x63, 0x00, 0x61, 0x86, 0x63, 0x00,
|
|
0x61, 0x82, 0x43, 0x00, 0x61, 0x83, 0xc3, 0x00, 0x61, 0x83, 0xc3, 0x00, 0x61, 0x91, 0x83, 0x00,
|
|
0x60, 0xe1, 0x83, 0x00, 0x70, 0x00, 0x07, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xff, 0x00,
|
|
0x7f, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x7c, 0xff, 0xcf, 0x00, 0x78, 0x7f, 0x87, 0x00,
|
|
0x78, 0x7f, 0x87, 0x00, 0x3c, 0xff, 0xcf, 0x00, 0x3f, 0xff, 0xfe, 0x00, 0x1f, 0xff, 0xfc, 0x00,
|
|
0x0f, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x1c, 0x00, 0x3c, 0x00,
|
|
0x1c, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x06, 0x00, 0x70, 0x00, 0x07, 0x00, 0xe0, 0x00, 0x03, 0x80
|
|
};
|
|
//--------------------------------------------------------------
|
|
static const unsigned char Power_ON[] PROGMEM = {
|
|
// Power On Logo: 37x40px
|
|
0x00, 0x01, 0xfe, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xc0, 0x07, 0x00, 0x3e, 0x01, 0xf0, 0x07, 0x00, 0xf0, 0x00, 0x38, 0x07,
|
|
0x07, 0x80, 0x08, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x03, 0x87, 0x0c, 0x00, 0x1c, 0x01, 0x87, 0x1c, 0xe0, 0x3c, 0x39, 0xc7,
|
|
0x18, 0xe0, 0x78, 0x38, 0xc7, 0x31, 0xc0, 0xf8, 0x1c, 0x67, 0x33, 0x80, 0xd8, 0x0e, 0x67, 0x73, 0x01, 0xd8, 0x06, 0x77,
|
|
0x63, 0x03, 0xb8, 0x06, 0x37, 0x67, 0x07, 0x3f, 0xc7, 0x37, 0x66, 0x06, 0x3f, 0xc3, 0x37, 0x66, 0x0e, 0x01, 0xc3, 0x37,
|
|
0x66, 0x1f, 0xe3, 0x83, 0x37, 0x66, 0x1f, 0xe7, 0x03, 0x37, 0x66, 0x00, 0xee, 0x03, 0x37, 0x67, 0x00, 0xcc, 0x07, 0x37,
|
|
0x63, 0x00, 0xdc, 0x06, 0x37, 0x73, 0x01, 0xf8, 0x06, 0x77, 0x33, 0x81, 0xf0, 0x0e, 0x67, 0x31, 0xc1, 0xe0, 0x1c, 0x67,
|
|
0x38, 0xe1, 0xe0, 0x38, 0xc7, 0xfc, 0xe3, 0xc0, 0x39, 0xff, 0x2c, 0x03, 0x80, 0x01, 0xc7, 0x2e, 0x03, 0x00, 0x03, 0xc7,
|
|
0x27, 0x00, 0x00, 0x07, 0x47, 0x20, 0xf0, 0x00, 0x38, 0x47, 0x20, 0xbe, 0x01, 0xf0, 0x47, 0x20, 0x8f, 0xff, 0xd0, 0x47,
|
|
0x20, 0x83, 0xfe, 0x10, 0x47, 0x20, 0x82, 0x04, 0x10, 0x47, 0x20, 0x82, 0x04, 0x10, 0x47, 0x20, 0x82, 0x04, 0x10, 0x47,
|
|
0x20, 0x82, 0x04, 0x10, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x82, 0x04, 0x10, 0x47, 0x3f, 0x83, 0xfc, 0x1f, 0xc7
|
|
};
|
|
//--------------------------------------------------------------
|
|
static const unsigned char Power_OFF[] PROGMEM = {
|
|
//Power OFF Logo: 37x40px
|
|
0x00, 0x01, 0xfe, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xc0, 0x07, 0x00, 0x3e, 0x01, 0xf0, 0x07, 0x00, 0x70, 0x00, 0x38, 0x07,
|
|
0x00, 0xc0, 0x00, 0x0c, 0x07, 0x01, 0x80, 0x00, 0x06, 0x07, 0x03, 0x00, 0x00, 0x03, 0x07, 0x06, 0x00, 0x30, 0x01, 0x87,
|
|
0x0c, 0x00, 0x30, 0x00, 0xc7, 0x0c, 0x00, 0x30, 0x00, 0xc7, 0x18, 0x00, 0x30, 0x00, 0x67, 0x18, 0x06, 0x31, 0x80, 0x67,
|
|
0x18, 0x06, 0x31, 0x80, 0x67, 0x30, 0x0c, 0x30, 0xc0, 0x37, 0x30, 0x18, 0x30, 0xc0, 0x37, 0x30, 0x18, 0x30, 0x60, 0x37,
|
|
0x30, 0x18, 0x30, 0x60, 0x37, 0x30, 0x18, 0x00, 0x60, 0x37, 0x30, 0x18, 0x00, 0x60, 0x37, 0x30, 0x18, 0x00, 0xc0, 0x37,
|
|
0x38, 0x0c, 0x00, 0xc0, 0x67, 0x18, 0x06, 0x01, 0x80, 0x67, 0x18, 0x07, 0x87, 0x80, 0x67, 0x3c, 0x03, 0xfe, 0x00, 0xc7,
|
|
0x2c, 0x00, 0x78, 0x00, 0xc7, 0xff, 0x00, 0x00, 0x03, 0xff, 0x23, 0x80, 0x00, 0x03, 0x47, 0x21, 0x80, 0x00, 0x06, 0x47,
|
|
0x20, 0xe0, 0x00, 0x1c, 0x47, 0x20, 0xf0, 0x00, 0x38, 0x47, 0x20, 0x3e, 0x01, 0xf0, 0x47, 0x20, 0x8f, 0xff, 0xd0, 0x47,
|
|
0x20, 0x83, 0xfe, 0x10, 0x47, 0x20, 0x82, 0x04, 0x10, 0x47, 0x24, 0x82, 0x04, 0x12, 0x47, 0x20, 0x82, 0x04, 0x10, 0x47,
|
|
0x20, 0x82, 0x04, 0x10, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x82, 0x04, 0x10, 0x47, 0x3f, 0x83, 0xfc, 0x1f, 0xc7
|
|
};
|
|
//--------------------------------------------------------------
|
|
static const unsigned char Power_EmSTOP[] PROGMEM = {
|
|
//Power Em Stop Logo: 38x39px
|
|
0x00, 0x7f, 0xff, 0xf8, 0x03, 0x00, 0xff, 0xff, 0xfc, 0x03, 0x01, 0xff, 0xff, 0xfe, 0x03, 0x01, 0xc0, 0x00, 0x0e, 0x03,
|
|
0x03, 0xc0, 0x00, 0x0f, 0x03, 0x07, 0x80, 0x00, 0x07, 0x83, 0x07, 0x00, 0x00, 0x03, 0x83, 0x0f, 0x00, 0x00, 0x03, 0xc3,
|
|
0x0e, 0x00, 0x00, 0x01, 0xe3, 0x1c, 0x00, 0x00, 0x00, 0xe3, 0x3c, 0x00, 0x00, 0x00, 0xf3, 0x38, 0x00, 0x00, 0x00, 0x73,
|
|
0x78, 0xef, 0x9f, 0x1f, 0x7b, 0xf1, 0x02, 0x31, 0x91, 0x3f, 0xe1, 0x02, 0x20, 0x91, 0x1f, 0xe1, 0xc2, 0x20, 0x91, 0x1f,
|
|
0xe0, 0x22, 0x20, 0x9f, 0x1f, 0xe0, 0x22, 0x20, 0x90, 0x1f, 0xf0, 0x22, 0x31, 0x90, 0x3f, 0x79, 0xc2, 0x1f, 0x10, 0x3b,
|
|
0x38, 0x00, 0x00, 0x00, 0x73, 0x3c, 0x00, 0x00, 0x00, 0xf3, 0x3e, 0x00, 0x00, 0x01, 0xe3, 0x2e, 0x00, 0x00, 0x01, 0xe3,
|
|
0xff, 0x00, 0x00, 0x03, 0xff, 0x27, 0x80, 0x00, 0x03, 0xc3, 0x27, 0x80, 0x00, 0x07, 0xc3, 0x23, 0xc0, 0x00, 0x0f, 0x43,
|
|
0x21, 0xc0, 0x00, 0x1e, 0x43, 0x21, 0xff, 0xff, 0xfe, 0x43, 0x20, 0xff, 0xff, 0xfc, 0x43, 0x20, 0xff, 0xff, 0xf8, 0x43,
|
|
0x20, 0x82, 0x04, 0x10, 0x43, 0x24, 0x82, 0x04, 0x12, 0x43, 0x20, 0x82, 0x04, 0x10, 0x43, 0x20, 0x82, 0x04, 0x10, 0x43,
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x82, 0x04, 0x10, 0x43, 0x3f, 0x83, 0xfc, 0x1f, 0xc3
|
|
};
|
|
//--------------------------------------------------------------
|
|
|
|
#if defined(Z21DISPLAY_SH1106)
|
|
//-------------CONFIG SH110X DISPLAY DRIVER-----------------------------------------
|
|
#include <Adafruit_SH110X.h>
|
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
|
|
#define DISPLAY_BG SH110X_BLACK //color for background
|
|
#define DISPLAY_TEXT SH110X_WHITE //Text color
|
|
#else
|
|
//-------------CONFIG SSD1306 DISPLAY DRIVER-----------------------------------------
|
|
#include <Adafruit_SSD1306.h>
|
|
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
|
|
#define DISPLAY_BG BLACK //color for background
|
|
#define DISPLAY_TEXT SSD1306_WHITE //Text color
|
|
#endif
|
|
|
|
//--------------------------------------------------------------
|
|
#define DisplayLineHight 9 //Pixel to get the next line
|
|
boolean DisplayReady = false; //Boot-Up progress has finish
|
|
uint8_t DisplayCounter = 0xFF; //for animation
|
|
|
|
//--------------------------------------------------------------
|
|
//remove old writing with a block box
|
|
void DisplayClearPart(uint8_t x, uint8_t y, uint8_t width) {
|
|
//x,y,width,hight
|
|
display.fillRect(x, y, width-x, DisplayLineHight, DISPLAY_BG);
|
|
display.setCursor(x,y);
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
/*
|
|
#if defined(DISPLAY_TRANSMISSION)
|
|
//display LAN/WLAN transmission:
|
|
void DisplayDataTransmission(bool activ = true) {
|
|
if (Railpower == csShortCircuit) //no space for System Info!
|
|
return;
|
|
uint8_t color = DISPLAY_BG;
|
|
if (activ == true)
|
|
color = DISPLAY_TEXT;
|
|
display.fillTriangle(100, 1, 98, 3, 102, 3, color); // Send Data
|
|
display.drawLine(100,3,100,10,color);
|
|
display.fillTriangle(105, 10, 103, 8, 107, 8, color); // Receive Data
|
|
display.drawLine(105,1,105,8, color);
|
|
display.display(); //show...
|
|
}
|
|
#endif
|
|
*/
|
|
|
|
//--------------------------------------------------------------
|
|
//update Z21 System Info
|
|
#if defined(BOOSTER_INT_MAINCURRENT)
|
|
void DisplayUpdateRailData(uint16_t inAm, float volt, float temp) {
|
|
if (Railpower == csShortCircuit) //no space for System Info!
|
|
return;
|
|
//display WLAN signal on ESP:
|
|
#if defined(ESP_WIFI)
|
|
int WLAN_Signal = WiFi.RSSI();
|
|
#endif
|
|
#if defined(ESP_WIFI) || defined(WIFI)
|
|
display.fillRect(114, 0, 14, 13,DISPLAY_BG); //clear old WLAN Signal
|
|
if (WLAN_Signal > 30) { //not connected!
|
|
display.drawLine(121,4,127,12,DISPLAY_TEXT); // \ //
|
|
display.drawLine(127,4,121,12,DISPLAY_TEXT); // / //
|
|
}
|
|
else {
|
|
if (WLAN_Signal > -30)
|
|
display.drawLine(127,2,127,12,DISPLAY_TEXT); //Ausgezeichnet
|
|
if (WLAN_Signal > -65)
|
|
display.drawLine(125,4,125,12,DISPLAY_TEXT); //Sehr gut
|
|
if (WLAN_Signal > -71)
|
|
display.drawLine(123,6,123,12,DISPLAY_TEXT); //Akzeptabel
|
|
if (WLAN_Signal > -78)
|
|
display.drawLine(121,8,121,12,DISPLAY_TEXT); //Schlecht
|
|
if (WLAN_Signal > -85)
|
|
display.drawLine(119,10,119,12,DISPLAY_TEXT); //Sehr schlecht
|
|
//mark position of empty bar:
|
|
for (uint8_t i = 0; i < 6; i++) {
|
|
display.drawPixel(119 + (i * 2),12, DISPLAY_TEXT);
|
|
}
|
|
}
|
|
//WLAN Antenne:
|
|
display.drawLine(117,0,117,12,DISPLAY_TEXT); // | //
|
|
display.drawLine(114,0,120,0,DISPLAY_TEXT); // - //
|
|
display.drawLine(114,1,117,5,DISPLAY_TEXT); // \ //
|
|
display.drawLine(117,5,120,1,DISPLAY_TEXT); // / //
|
|
display.drawLine(117,5,120,1,DISPLAY_TEXT); // / //
|
|
|
|
DisplayClearPart(88, 0, 110);
|
|
#if defined(WIFI)
|
|
display.print(ESPsoftAPStationNum); //AP connected clients
|
|
#else
|
|
display.print(WiFi.softAPgetStationNum()); //AP connected clients
|
|
#endif
|
|
display.drawLine(95,0,95,7,DISPLAY_TEXT); // | //
|
|
display.setCursor(98,0);
|
|
display.print("8"); //max 8 number of clients
|
|
#endif
|
|
if (Railpower == csServiceMode) //stop here for full screen logo:
|
|
return;
|
|
//display System Info:
|
|
DisplayClearPart(40, DisplayLineHight, 80);
|
|
display.print(String(float(inAm)/1000, AMP_DECIMALS)); // A.aa Amper
|
|
display.print(F("A"));
|
|
//ESP8266 has only one ADC, so there is only the sense Value!
|
|
if (temp != 0.0) {
|
|
DisplayClearPart(90, 18, SCREEN_WIDTH); // 18 = DisplayLineHight * 2
|
|
display.print(temp,1); //one decimal place only!
|
|
display.print((char)247);
|
|
display.print(F("C"));
|
|
}
|
|
if (volt != 0) {
|
|
DisplayClearPart(0, DisplayLineHight, 40);
|
|
display.print(volt / 1000,1); //one decimal place only!
|
|
display.print(F("V"));
|
|
}
|
|
// drawing commands to make them visible on screen!
|
|
display.display();
|
|
}
|
|
#endif
|
|
|
|
//--------------------------------------------------------------
|
|
//draw a long rail on display
|
|
void drawLongRail(void) {
|
|
display.drawLine(0, 47, 44, 47,DISPLAY_TEXT); //Schiene links
|
|
display.drawLine(79, 47, SCREEN_WIDTH, 47,DISPLAY_TEXT); //Schiene rechts
|
|
display.drawLine(0, 59, SCREEN_WIDTH, 59,DISPLAY_TEXT); //Schiene unten
|
|
display.drawRect(-4, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
display.drawRect(8, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
display.drawRect(20, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
display.drawRect(32, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
//Logo
|
|
display.drawRect(81, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
display.drawRect(93, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
display.drawRect(105, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
display.drawRect(117, 45, 7, 17, DISPLAY_TEXT); //Schwelle
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
//Update the config data on display
|
|
void DisplayConfigData() {
|
|
|
|
//remove all old data:
|
|
display.fillRect(0,18, SCREEN_WIDTH, 46, DISPLAY_BG); //remove the config data
|
|
|
|
byte y = DisplayLineHight; //Start after S88 Module output!
|
|
|
|
#if defined(S88N)
|
|
y += DisplayLineHight;
|
|
DisplayUpdateS88N();
|
|
#endif
|
|
|
|
#if defined(LAN)
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("Eth: "));
|
|
display.print(LAN_ip);
|
|
#endif
|
|
|
|
#if defined(WIFI)
|
|
if (ESPSwVer != 0.0) { //we already receive data?
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("WLAN: "));
|
|
if (WLANlocalIP[0] != 0)
|
|
display.print(WLANlocalIP); //0xE4 = Client IP
|
|
else display.print(F("[none]"));
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(WLANssid); //0xE5 = Client SSID Name
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("ESP Sw v"));
|
|
display.print(ESPSwVer); //0xE8 = ESP Sw Version
|
|
}
|
|
#endif
|
|
|
|
#if defined(ESP_WIFI)
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("ID:")); //AP SSID
|
|
display.print(ssidAP); //AP Name
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("Pw:"));
|
|
display.print(passAP);
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("IP:"));
|
|
display.print(WiFi.softAPIP());
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(F("WLAN: "));
|
|
display.print(WiFi.localIP().toString());
|
|
y += DisplayLineHight;
|
|
DisplayClearPart(0, y, SCREEN_WIDTH);
|
|
display.print(ssid.c_str());
|
|
#endif
|
|
|
|
// drawing commands to make them visible on screen!
|
|
display.display();
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
//update power status
|
|
void DisplayUpdateRailPower(bool clear) {
|
|
//Railpower: ON, OFF, PROG, SHORT
|
|
if (DisplayCounter == 0xFF)
|
|
DisplayClearPart(40, 0, 70);
|
|
if (clear == true)
|
|
display.clearDisplay();
|
|
switch (Railpower) {
|
|
case csNormal: {
|
|
if (DisplayCounter == 0) //nothing more to do!
|
|
return;
|
|
else DisplayCounter--;
|
|
if (DisplayCounter == 1) { //last timer tick
|
|
display.fillRect(0,18, SCREEN_WIDTH, 46, DISPLAY_BG); //remove the config data
|
|
drawLongRail();
|
|
display.drawBitmap(42,22, Power_ON, 37, 40, DISPLAY_TEXT); //EmSTOP Logo
|
|
display.display();
|
|
return;
|
|
}
|
|
if (DisplayCounter == 254) {
|
|
display.print(F("-ON-")); //first time show power status
|
|
DisplayConfigData();
|
|
}
|
|
else return;
|
|
break;
|
|
}
|
|
case csTrackVoltageOff: {
|
|
display.print(F("-OFF-"));
|
|
display.fillRect(0,18, SCREEN_WIDTH, 46, DISPLAY_BG); //remove the config data
|
|
drawLongRail();
|
|
display.drawBitmap(42,22, Power_OFF, 37, 40, DISPLAY_TEXT); //Power OFF Logo
|
|
break;
|
|
}
|
|
case csServiceMode: {
|
|
display.fillRect(0,18, SCREEN_WIDTH, 46, DISPLAY_BG); //remove the config data
|
|
display.drawBitmap(51,22, Power_PROG, 25, 36, DISPLAY_TEXT); //Service Mode CV Logo
|
|
break;
|
|
}
|
|
case csShortCircuit: {
|
|
//draw blinking attention mark!
|
|
uint8_t color = DISPLAY_BG; //flash color
|
|
if (DisplayCounter == 0xFF) { //start-up
|
|
DisplayCounter = 0xF0; //clear the counter
|
|
display.clearDisplay();
|
|
color = DISPLAY_TEXT; //change color
|
|
}
|
|
else {
|
|
DisplayCounter = 0xFF; //reset
|
|
display.fillRect(0 ,0, SCREEN_WIDTH, SCREEN_HEIGHT, DISPLAY_TEXT); //make screen white
|
|
}
|
|
for(int8_t i=22; i < 26; i+=1) {
|
|
display.drawTriangle(
|
|
64 , 32-i,
|
|
64-i, 32+i,
|
|
64+i, 32+i, color);
|
|
}
|
|
display.fillTriangle(62 ,20, 64, 20, 58, 35, color); // (/)
|
|
display.drawLine(58, 35, 67, 31, color); // (-)
|
|
display.drawLine(58, 36, 67, 32, color); // (-)
|
|
display.fillTriangle(65 ,32, 67, 32, 62, 44, color); // (/)
|
|
display.fillTriangle(61 ,44, 65, 44, 63, 49, color); // (\/)
|
|
display.display();
|
|
return;
|
|
}
|
|
case csEmergencyStop: {
|
|
display.fillRect(0,18, SCREEN_WIDTH, 46, DISPLAY_BG); //remove the config data
|
|
drawLongRail();
|
|
display.drawBitmap(42,23, Power_EmSTOP, 38, 39, DISPLAY_TEXT); //EmSTOP Logo
|
|
break;
|
|
}
|
|
default: display.print(F("-!?!-")); break; //unknown!
|
|
}
|
|
|
|
display.setCursor(0,0); // Start at top-left corner
|
|
display.print(F("Z21PG"));
|
|
display.display();
|
|
if (Railpower != csNormal) { //only show config in normal mode
|
|
DisplayCounter = 0xFF; //reset
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
//update S88N Module
|
|
#if defined(S88N)
|
|
void DisplayUpdateS88N() {
|
|
if (DisplayReady) {
|
|
display.setTextSize(1);
|
|
DisplayClearPart(0, 18, 89); //DisplayLineHight * 2
|
|
display.print(F("S88: "));
|
|
display.print(S88Module);
|
|
// drawing commands to make them visible on screen!
|
|
display.display();
|
|
}
|
|
}
|
|
#endif //S88 Module
|
|
|
|
//--------------------------------------------------------------
|
|
void DisplayBoot(byte percent) {
|
|
//draw a bar:
|
|
display.drawRoundRect(14, 47, 100, 6, 2, DISPLAY_TEXT); //outside (x0, y0, w, h, radius, color)
|
|
display.fillRect(14, 49, percent, 2, DISPLAY_TEXT); //inside
|
|
// drawing commands to make them visible on screen!
|
|
display.display();
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
//report OTA Update on Display!
|
|
#if (defined(ESP8266_MCU) || defined(ESP32_MCU)) && defined(ESP_OTA)
|
|
void DisplayOTAStart() {
|
|
// Clear the buffer
|
|
display.clearDisplay();
|
|
display.setTextSize(2);
|
|
display.setCursor(0,0); // Start at top-left corner
|
|
display.print(F("Update..."));
|
|
// drawing commands to make them visible on screen!
|
|
display.display();
|
|
}
|
|
//--------------------------------------------------------------
|
|
void DisplayOTAProgress(uint8_t state) {
|
|
display.setTextSize(1);
|
|
DisplayClearPart(16, 36, SCREEN_WIDTH);
|
|
display.printf("Progress: %u%%", state);
|
|
// drawing commands to make them visible on screen!
|
|
DisplayBoot(state);
|
|
}
|
|
//--------------------------------------------------------------
|
|
void DisplayOTAFinish() {
|
|
display.clearDisplay();
|
|
display.drawBitmap(22, 8, Z21Bitmap, 80, 37, DISPLAY_TEXT); //Z21 Logo
|
|
display.display();
|
|
}
|
|
#endif //OTA Messages
|
|
|
|
//--------------------------------------------------------------
|
|
//Init the Display
|
|
void DisplaySetup(void) {
|
|
byte error, address = Z21DISPLAY;
|
|
//suchen der I2C Address des Display am Bus:
|
|
if (address == 0 || address > 127) {
|
|
#if defined(DEBUG)
|
|
Debug.print(F("Display..."));
|
|
#endif
|
|
Wire.begin();
|
|
|
|
do {
|
|
address++;
|
|
// The i2c_scanner uses the return value of
|
|
// the Write.endTransmisstion to see if
|
|
// a device did acknowledge to the address.
|
|
Wire.beginTransmission(address);
|
|
error = Wire.endTransmission();
|
|
}
|
|
while (error != 0 && address <= 127);
|
|
|
|
if (error != 0)
|
|
address = Z21DISPLAY; //kein I2C device!
|
|
#if defined(DEBUG)
|
|
if (error == 0) {
|
|
Debug.print(F("0x"));
|
|
if (address < 16)
|
|
Debug.print("0");
|
|
Debug.println(address,HEX);
|
|
}
|
|
else Debug.println(F("nicht gefunden!"));
|
|
#endif
|
|
}
|
|
|
|
#if defined(Z21DISPLAY_SH1106)
|
|
display.begin(address, true); // Address 0x3C default
|
|
#if defined(Z21DISPLAY_CONTRAST)
|
|
display.setContrast(Z21DISPLAY_CONTRAST); //gewünschter Kontrast-Wert 0-255
|
|
#endif
|
|
#else
|
|
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
|
|
display.begin(SSD1306_SWITCHCAPVCC, address); //<-- See datasheet for Address; 0x3D for 128x32, 0x3C for 128x64
|
|
#if defined(Z21DISPLAY_CONTRAST)
|
|
display.ssd1306_command(SSD1306_SETCONTRAST);
|
|
display.ssd1306_command(Z21DISPLAY_CONTRAST); //gewünschter Kontrast-Wert 0-255
|
|
#endif
|
|
#endif
|
|
|
|
// Clear the buffer
|
|
display.clearDisplay();
|
|
display.setTextColor(DISPLAY_TEXT); // Draw white text
|
|
display.setCursor(0,0); // Start at top-left corner with Sw Version
|
|
display.print(F("v"));
|
|
display.print(String(Z21mobileSwVer).substring(0,1));
|
|
display.print(".");
|
|
display.print(String(Z21mobileSwVer).substring(1));
|
|
|
|
display.setCursor(0,56);
|
|
display.print(comp_date); //Build Data
|
|
|
|
display.drawBitmap(22, 8, Z21Bitmap, 80, 37, DISPLAY_TEXT); //Z21 Logo
|
|
DisplayBoot(0); //Boot up bar...
|
|
}
|
|
#endif
|