mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-22 13:26:10 +02:00
pass full display config to Display_Mono classes for better maintainability
This commit is contained in:
parent
e88809c795
commit
08dc6d2194
6 changed files with 48 additions and 74 deletions
|
@ -50,12 +50,11 @@ class Display {
|
||||||
mEpaper.init(mCfg->type, mCfg->disp_cs, mCfg->disp_dc, mCfg->disp_reset, mCfg->disp_busy, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mDisplayData.version);
|
mEpaper.init(mCfg->type, mCfg->disp_cs, mCfg->disp_dc, mCfg->disp_reset, mCfg->disp_busy, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mDisplayData.version);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default: mMono = NULL; break;
|
default: mMono = NULL; break;
|
||||||
}
|
}
|
||||||
if(mMono) {
|
if(mMono) {
|
||||||
mMono->config(mCfg->pwrSaveAtIvOffline, mCfg->screenSaver, mCfg->contrast, mCfg->graph_ratio, mCfg->graph_size);
|
mMono->config(mCfg);
|
||||||
mMono->init(mCfg->type, mCfg->rot, mCfg->disp_cs, mCfg->disp_dc, 0xff, mCfg->disp_clk, mCfg->disp_data, &mDisplayData);
|
mMono->init(&mDisplayData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup PIR pin for motion sensor
|
// setup PIR pin for motion sensor
|
||||||
|
@ -78,7 +77,7 @@ class Display {
|
||||||
bool request_refresh = false;
|
bool request_refresh = false;
|
||||||
|
|
||||||
if (mMono != NULL)
|
if (mMono != NULL)
|
||||||
request_refresh = mMono->loop(mCfg->contrast, motionSensorActive());
|
request_refresh = mMono->loop(motionSensorActive());
|
||||||
|
|
||||||
if (mNewPayload || (((++mLoopCnt) % 5) == 0) || request_refresh) {
|
if (mNewPayload || (((++mLoopCnt) % 5) == 0) || request_refresh) {
|
||||||
DataScreen();
|
DataScreen();
|
||||||
|
|
|
@ -25,23 +25,22 @@ class DisplayMono {
|
||||||
public:
|
public:
|
||||||
DisplayMono() {};
|
DisplayMono() {};
|
||||||
|
|
||||||
virtual void init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) = 0;
|
virtual void init(DisplayData *displayData) = 0;
|
||||||
virtual void config(bool enPowerSave, uint8_t screenSaver, uint8_t lum, uint8_t graph_ratio, uint8_t graph_size) = 0;
|
virtual void config(display_t *cfg) = 0;
|
||||||
virtual void disp(void) = 0;
|
virtual void disp(void) = 0;
|
||||||
|
|
||||||
// Common loop function, manages display on/off functions for powersave and screensaver with motionsensor
|
// Common loop function, manages display on/off functions for powersave and screensaver with motionsensor
|
||||||
// can be overridden by subclasses
|
// can be overridden by subclasses
|
||||||
virtual bool loop(uint8_t lum, bool motion) {
|
virtual bool loop(bool motion) {
|
||||||
|
|
||||||
bool dispConditions = (!mEnPowerSave || (mDisplayData->nrProducing > 0)) &&
|
bool dispConditions = (!mCfg->pwrSaveAtIvOffline || (mDisplayData->nrProducing > 0)) &&
|
||||||
((mScreenSaver != 2) || motion); // screensaver 2 .. motionsensor
|
((mCfg->screenSaver != 2) || motion); // screensaver 2 .. motionsensor
|
||||||
|
|
||||||
if (mDisplayActive) {
|
if (mDisplayActive) {
|
||||||
if (!dispConditions) {
|
if (!dispConditions) {
|
||||||
if (mDisplayTime.isTimeout()) { // switch display off after timeout
|
if (mDisplayTime.isTimeout()) { // switch display off after timeout
|
||||||
mDisplayActive = false;
|
mDisplayActive = false;
|
||||||
mDisplay->setPowerSave(true);
|
mDisplay->setPowerSave(true);
|
||||||
DBGPRINTLN("**** Display off ****");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -52,16 +51,15 @@ class DisplayMono {
|
||||||
mDisplayActive = true;
|
mDisplayActive = true;
|
||||||
mDisplayTime.reStartTimeMonitor(); // switch display on
|
mDisplayTime.reStartTimeMonitor(); // switch display on
|
||||||
mDisplay->setPowerSave(false);
|
mDisplay->setPowerSave(false);
|
||||||
DBGPRINTLN("**** Display on ****");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mLuminance != lum) {
|
if(mLuminance != mCfg->contrast) {
|
||||||
mLuminance = lum;
|
mLuminance = mCfg->contrast;
|
||||||
mDisplay->setContrast(mLuminance);
|
mDisplay->setContrast(mLuminance);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(monoMaintainDispSwitchState());
|
return(monoMaintainDispSwitchState()); // return flag, if display content should be updated immediately
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -71,7 +69,8 @@ class DisplayMono {
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
U8G2* mDisplay;
|
display_t *mCfg;
|
||||||
|
U8G2 *mDisplay;
|
||||||
DisplayData *mDisplayData;
|
DisplayData *mDisplayData;
|
||||||
|
|
||||||
float *mPgData = nullptr;
|
float *mPgData = nullptr;
|
||||||
|
@ -82,17 +81,10 @@ class DisplayMono {
|
||||||
uint32_t mPgTimeOfDay = 0;
|
uint32_t mPgTimeOfDay = 0;
|
||||||
uint8_t mPgLastPos = 0;
|
uint8_t mPgLastPos = 0;
|
||||||
|
|
||||||
uint8_t mType;
|
|
||||||
uint16_t mDispWidth;
|
uint16_t mDispWidth;
|
||||||
uint16_t mDispHeight;
|
uint16_t mDispHeight;
|
||||||
|
|
||||||
bool mEnPowerSave;
|
|
||||||
uint8_t mScreenSaver = 1; // 0 .. off; 1 .. pixelShift; 2 .. motionsensor
|
|
||||||
uint8_t mLuminance;
|
uint8_t mLuminance;
|
||||||
uint8_t mGraphRatio;
|
|
||||||
uint8_t mGraphSize;
|
|
||||||
|
|
||||||
uint8_t mLoopCnt;
|
|
||||||
uint8_t mLineXOffsets[5] = {};
|
uint8_t mLineXOffsets[5] = {};
|
||||||
uint8_t mLineYOffsets[5] = {};
|
uint8_t mLineYOffsets[5] = {};
|
||||||
|
|
||||||
|
@ -105,9 +97,8 @@ class DisplayMono {
|
||||||
char mFmtText[DISP_FMT_TEXT_LEN];
|
char mFmtText[DISP_FMT_TEXT_LEN];
|
||||||
|
|
||||||
// Common initialization function to be called by subclasses
|
// Common initialization function to be called by subclasses
|
||||||
void monoInit(U8G2* display, uint8_t type, DisplayData *displayData) {
|
void monoInit(U8G2* display, DisplayData *displayData) {
|
||||||
mDisplay = display;
|
mDisplay = display;
|
||||||
mType = type;
|
|
||||||
mDisplayData = displayData;
|
mDisplayData = displayData;
|
||||||
mDisplay->begin();
|
mDisplay->begin();
|
||||||
mDisplay->setPowerSave(false); // always start with display on
|
mDisplay->setPowerSave(false); // always start with display on
|
||||||
|
@ -116,10 +107,10 @@ class DisplayMono {
|
||||||
mDispWidth = mDisplay->getDisplayWidth();
|
mDispWidth = mDisplay->getDisplayWidth();
|
||||||
mDispHeight = mDisplay->getDisplayHeight();
|
mDispHeight = mDisplay->getDisplayHeight();
|
||||||
mDispSwitchTime.stopTimeMonitor();
|
mDispSwitchTime.stopTimeMonitor();
|
||||||
if (mGraphRatio == 100) // if graph ratio is 100% start in graph mode
|
if (mCfg->graph_ratio == 100) // if graph ratio is 100% start in graph mode
|
||||||
mDispSwitchState = DispSwitchState::GRAPH;
|
mDispSwitchState = DispSwitchState::GRAPH;
|
||||||
else if (mGraphRatio != 0)
|
else if (mCfg->graph_ratio != 0)
|
||||||
mDispSwitchTime.startTimeMonitor(150 * (100 - mGraphRatio)); // start display mode change only if ratio is neither 0 nor 100
|
mDispSwitchTime.startTimeMonitor(150 * (100 - mCfg->graph_ratio)); // start display mode change only if ratio is neither 0 nor 100
|
||||||
}
|
}
|
||||||
|
|
||||||
bool monoMaintainDispSwitchState(void) {
|
bool monoMaintainDispSwitchState(void) {
|
||||||
|
@ -128,14 +119,14 @@ class DisplayMono {
|
||||||
case DispSwitchState::TEXT:
|
case DispSwitchState::TEXT:
|
||||||
if (mDispSwitchTime.isTimeout()) {
|
if (mDispSwitchTime.isTimeout()) {
|
||||||
mDispSwitchState = DispSwitchState::GRAPH;
|
mDispSwitchState = DispSwitchState::GRAPH;
|
||||||
mDispSwitchTime.startTimeMonitor(150 * mGraphRatio); // mGraphRatio: 0-100 Gesamtperiode 15000 ms
|
mDispSwitchTime.startTimeMonitor(150 * mCfg->graph_ratio); // mGraphRatio: 0-100 Gesamtperiode 15000 ms
|
||||||
change = true;
|
change = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DispSwitchState::GRAPH:
|
case DispSwitchState::GRAPH:
|
||||||
if (mDispSwitchTime.isTimeout()) {
|
if (mDispSwitchTime.isTimeout()) {
|
||||||
mDispSwitchState = DispSwitchState::TEXT;
|
mDispSwitchState = DispSwitchState::TEXT;
|
||||||
mDispSwitchTime.startTimeMonitor(150 * (100 - mGraphRatio));
|
mDispSwitchTime.startTimeMonitor(150 * (100 - mCfg->graph_ratio));
|
||||||
change = true;
|
change = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -147,7 +138,6 @@ class DisplayMono {
|
||||||
mPgWidth = width;
|
mPgWidth = width;
|
||||||
mPgHeight = height;
|
mPgHeight = height;
|
||||||
mPgData = new float[mPgWidth];
|
mPgData = new float[mPgWidth];
|
||||||
//memset(mPgData, 0, mPgWidth);
|
|
||||||
resetPowerGraph();
|
resetPowerGraph();
|
||||||
/*
|
/*
|
||||||
Inverter<> *iv;
|
Inverter<> *iv;
|
||||||
|
@ -195,7 +185,7 @@ class DisplayMono {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getPowerGraphXpos(uint8_t p) { //
|
uint8_t getPowerGraphXpos(uint8_t p) {
|
||||||
if ((p <= mPgLastPos) && (mPgLastPos > 0))
|
if ((p <= mPgLastPos) && (mPgLastPos > 0))
|
||||||
return((p * (mPgWidth - 1)) / mPgLastPos); // scaling of x-axis
|
return((p * (mPgWidth - 1)) / mPgLastPos); // scaling of x-axis
|
||||||
else
|
else
|
||||||
|
@ -255,7 +245,7 @@ class DisplayMono {
|
||||||
// pixelshift screensaver with wipe effect
|
// pixelshift screensaver with wipe effect
|
||||||
void calcPixelShift(int range) {
|
void calcPixelShift(int range) {
|
||||||
int8_t mod = (millis() / 10000) % ((range >> 1) << 2);
|
int8_t mod = (millis() / 10000) % ((range >> 1) << 2);
|
||||||
mPixelshift = mScreenSaver == 1 ? ((mod < range) ? mod - (range >> 1) : -(mod - range - (range >> 1) + 1)) : 0;
|
mPixelshift = mCfg->screenSaver == 1 ? ((mod < range) ? mod - (range >> 1) : -(mod - range - (range >> 1) + 1)) : 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,17 +12,13 @@ class DisplayMono128X32 : public DisplayMono {
|
||||||
mExtra = 0;
|
mExtra = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void config(bool enPowerSave, uint8_t screenSaver, uint8_t lum, uint8_t graph_ratio, uint8_t graph_size) {
|
void config(display_t *cfg) {
|
||||||
mEnPowerSave = enPowerSave;
|
mCfg = cfg;
|
||||||
mScreenSaver = screenSaver;
|
|
||||||
mLuminance = lum;
|
|
||||||
mGraphRatio = graph_ratio;
|
|
||||||
mGraphSize = graph_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) {
|
void init(DisplayData *displayData) {
|
||||||
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0);
|
u8g2_cb_t *rot = (u8g2_cb_t *)((mCfg->rot != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||||
monoInit(new U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C(rot, reset, clock, data), type, displayData);
|
monoInit(new U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C(rot, 0xff, mCfg->disp_clk, mCfg->disp_data), displayData);
|
||||||
calcLinePositions();
|
calcLinePositions();
|
||||||
printText("Ahoy!", 0);
|
printText("Ahoy!", 0);
|
||||||
printText("ahoydtu.de", 2);
|
printText("ahoydtu.de", 2);
|
||||||
|
|
|
@ -12,31 +12,27 @@ class DisplayMono128X64 : public DisplayMono {
|
||||||
mExtra = 0;
|
mExtra = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void config(bool enPowerSave, uint8_t screenSaver, uint8_t lum, uint8_t graph_ratio, uint8_t graph_size) {
|
void config(display_t *cfg) {
|
||||||
mEnPowerSave = enPowerSave;
|
mCfg = cfg;
|
||||||
mScreenSaver = screenSaver;
|
|
||||||
mLuminance = lum;
|
|
||||||
mGraphRatio = graph_ratio;
|
|
||||||
mGraphSize = graph_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) {
|
void init(DisplayData *displayData) {
|
||||||
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0);
|
u8g2_cb_t *rot = (u8g2_cb_t *)(( mCfg->rot != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||||
switch (type) {
|
switch (mCfg->type) {
|
||||||
case 1:
|
case 1:
|
||||||
monoInit(new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data), type, displayData);
|
monoInit(new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, 0xff, mCfg->disp_clk, mCfg->disp_data), displayData);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
monoInit(new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, reset, clock, data), type, displayData);
|
monoInit(new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, 0xff, mCfg->disp_clk, mCfg->disp_data), displayData);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
default:
|
default:
|
||||||
monoInit(new U8G2_SSD1309_128X64_NONAME0_F_HW_I2C(rot, reset, clock, data), type, displayData);
|
monoInit(new U8G2_SSD1309_128X64_NONAME0_F_HW_I2C(rot, 0xff, mCfg->disp_clk, mCfg->disp_data), displayData);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
calcLinePositions();
|
calcLinePositions();
|
||||||
|
|
||||||
switch(mGraphSize) { // var opts2 = [[0, "Line 1 - 2"], [1, "Line 2 - 3"], [2, "Line 1 - 3"], [3, "Line 2 - 4"], [4, "Line 1 - 4"]];
|
switch(mCfg->graph_size) { // var opts2 = [[0, "Line 1 - 2"], [1, "Line 2 - 3"], [2, "Line 1 - 3"], [3, "Line 2 - 4"], [4, "Line 1 - 4"]];
|
||||||
case 0:
|
case 0:
|
||||||
graph_first_line = 1;
|
graph_first_line = 1;
|
||||||
graph_last_line = 2;
|
graph_last_line = 2;
|
||||||
|
@ -60,7 +56,7 @@ class DisplayMono128X64 : public DisplayMono {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
widthShrink = (mScreenSaver == 1) ? pixelShiftRange : 0; // shrink graphwidth for pixelshift screensaver
|
widthShrink = (mCfg->screenSaver == 1) ? pixelShiftRange : 0; // shrink graphwidth for pixelshift screensaver
|
||||||
|
|
||||||
initPowerGraph(mDispWidth - 22 - widthShrink, mLineYOffsets[graph_last_line] - mLineYOffsets[graph_first_line - 1] - 2);
|
initPowerGraph(mDispWidth - 22 - widthShrink, mLineYOffsets[graph_last_line] - mLineYOffsets[graph_first_line - 1] - 2);
|
||||||
|
|
||||||
|
|
|
@ -12,18 +12,14 @@ class DisplayMono64X48 : public DisplayMono {
|
||||||
mExtra = 0;
|
mExtra = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void config(bool enPowerSave, uint8_t screenSaver, uint8_t lum, uint8_t graph_ratio, uint8_t graph_size) {
|
void config(display_t *cfg) {
|
||||||
mEnPowerSave = enPowerSave;
|
mCfg = cfg;
|
||||||
mScreenSaver = screenSaver;
|
|
||||||
mLuminance = lum;
|
|
||||||
mGraphRatio = graph_ratio;
|
|
||||||
mGraphSize = graph_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) {
|
void init(DisplayData *displayData) {
|
||||||
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0);
|
u8g2_cb_t *rot = (u8g2_cb_t *)((mCfg->rot != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||||
// Wemos OLed Shield is not defined in u8 lib -> use nearest compatible
|
// Wemos OLed Shield is not defined in u8 lib -> use nearest compatible
|
||||||
monoInit(new U8G2_SSD1306_64X48_ER_F_HW_I2C(rot, reset, clock, data), type, displayData);
|
monoInit(new U8G2_SSD1306_64X48_ER_F_HW_I2C(rot, 0xff, mCfg->disp_clk, mCfg->disp_data), displayData);
|
||||||
|
|
||||||
calcLinePositions();
|
calcLinePositions();
|
||||||
printText("Ahoy!", 0);
|
printText("Ahoy!", 0);
|
||||||
|
|
|
@ -12,20 +12,17 @@ class DisplayMono84X48 : public DisplayMono {
|
||||||
mExtra = 0;
|
mExtra = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void config(bool enPowerSave, uint8_t screenSaver, uint8_t lum, uint8_t graph_ratio, uint8_t graph_size) {
|
void config(display_t *cfg) {
|
||||||
mEnPowerSave = enPowerSave;
|
mCfg = cfg;
|
||||||
mScreenSaver = screenSaver;
|
|
||||||
mLuminance = lum;
|
|
||||||
mGraphRatio = graph_ratio;
|
|
||||||
mGraphSize = graph_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) {
|
void init(DisplayData *displayData) {
|
||||||
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0);
|
u8g2_cb_t *rot = (u8g2_cb_t *)((mCfg->rot != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||||
monoInit(new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset), type, displayData);
|
|
||||||
|
monoInit(new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, mCfg->disp_clk, mCfg->disp_data, mCfg->disp_cs, mCfg->disp_dc, 0xff), displayData);
|
||||||
calcLinePositions();
|
calcLinePositions();
|
||||||
|
|
||||||
switch(mGraphSize) { // var opts2 = [[0, "Line 1 - 2"], [1, "Line 2 - 3"], [2, "Line 1 - 3"], [3, "Line 2 - 4"], [4, "Line 1 - 4"]];
|
switch(mCfg->graph_size) { // var opts2 = [[0, "Line 1 - 2"], [1, "Line 2 - 3"], [2, "Line 1 - 3"], [3, "Line 2 - 4"], [4, "Line 1 - 4"]];
|
||||||
case 0:
|
case 0:
|
||||||
graph_first_line = 1;
|
graph_first_line = 1;
|
||||||
graph_last_line = 2;
|
graph_last_line = 2;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue