mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-22 05:16:11 +02:00
improve pixelshift screensaver
(cherry picked from commit 9eaa369147430c7d8c94830f325192e8f2e81853)
This commit is contained in:
parent
9647044e49
commit
0a6437bf10
4 changed files with 54 additions and 43 deletions
|
@ -78,6 +78,7 @@ class DisplayMono {
|
|||
uint8_t mLineYOffsets[5] = {};
|
||||
|
||||
uint8_t mExtra;
|
||||
int8_t mPixelshift=0;
|
||||
uint32_t mStarttime = millis();
|
||||
bool mDisplayActive = true; // always start with display on
|
||||
char mFmtText[DISP_FMT_TEXT_LEN];
|
||||
|
@ -94,6 +95,11 @@ class DisplayMono {
|
|||
mDispWidth = mDisplay->getDisplayWidth();
|
||||
mDispHeight = mDisplay->getDisplayHeight();
|
||||
}
|
||||
|
||||
void calcPixelShift(int range) {
|
||||
int8_t mod = (millis() / 10000) % ((range >> 1) << 2);
|
||||
mPixelshift = mScreenSaver == 1 ? ((mod < range) ? mod - (range >> 1) : -(mod - range - (range >> 1) + 1)) : 0;
|
||||
}
|
||||
};
|
||||
|
||||
/* adapted 5x8 Font for low-res displays with symbols
|
||||
|
|
|
@ -31,9 +31,8 @@ class DisplayMono128X32 : public DisplayMono {
|
|||
void disp(void) {
|
||||
mDisplay->clearBuffer();
|
||||
|
||||
// set Contrast of the Display to raise the lifetime
|
||||
if (3 != mType)
|
||||
mDisplay->setContrast(mLuminance);
|
||||
// calculate current pixelshift for pixelshift screensaver
|
||||
calcPixelShift(pixelShiftRange);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
|
||||
if (mDisplayData->totalPower > 999)
|
||||
|
@ -67,6 +66,8 @@ class DisplayMono128X32 : public DisplayMono {
|
|||
}
|
||||
|
||||
private:
|
||||
const uint8_t pixelShiftRange = 7; // number of pixels to shift from left to right (centered -> must be odd!)
|
||||
|
||||
void calcLinePositions() {
|
||||
uint8_t yOff[] = {0, 0};
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
|
@ -108,7 +109,7 @@ class DisplayMono128X32 : public DisplayMono {
|
|||
void printText(const char *text, uint8_t line) {
|
||||
setFont(line);
|
||||
|
||||
uint8_t dispX = mLineXOffsets[line] + ((mScreenSaver==1) ? (mExtra % 7) : 0);
|
||||
uint8_t dispX = mLineXOffsets[line] + pixelShiftRange / 2 + mPixelshift;
|
||||
|
||||
if (isTwoRowLine(line)) {
|
||||
String stringText = String(text);
|
||||
|
|
|
@ -58,8 +58,8 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
mDisplay->drawPixel(mDispWidth-1, mDispHeight-1);
|
||||
*/
|
||||
|
||||
// set Contrast of the Display to raise the lifetime
|
||||
mDisplay->setContrast(mLuminance);
|
||||
// calculate current pixelshift for pixelshift screensaver
|
||||
calcPixelShift(pixelShiftRange);
|
||||
|
||||
// print total power
|
||||
if (mDisplayData->nrProducing > 0) {
|
||||
|
@ -109,44 +109,48 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
pos = (mDispWidth - mDisplay->getStrWidth(mFmtText)) / 2;
|
||||
mDisplay->setFont(u8g2_font_ncenB08_symbols8_ahoy);
|
||||
if (sun_pos!=-1)
|
||||
mDisplay->drawStr(pos + sun_pos + pixelshift(), mLineYOffsets[l_Status], "G"); // sun
|
||||
mDisplay->drawStr(pos + sun_pos + mPixelshift, mLineYOffsets[l_Status], "G"); // sun
|
||||
if (moon_pos!=-1)
|
||||
mDisplay->drawStr(pos + moon_pos + pixelshift(), mLineYOffsets[l_Status], "H"); // moon
|
||||
mDisplay->drawStr(pos + moon_pos + mPixelshift, mLineYOffsets[l_Status], "H"); // moon
|
||||
}
|
||||
|
||||
// print yields
|
||||
mDisplay->setFont(u8g2_font_ncenB10_symbols10_ahoy);
|
||||
mDisplay->drawStr(15 + pixelshift(), mLineYOffsets[l_YieldDay], "I"); // day
|
||||
mDisplay->drawStr(15 + pixelshift(), mLineYOffsets[l_YieldTotal], "D"); // total
|
||||
mDisplay->drawStr(17 + mPixelshift, mLineYOffsets[l_YieldDay], "I"); // day
|
||||
mDisplay->drawStr(17 + mPixelshift, mLineYOffsets[l_YieldTotal], "D"); // total
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%7.0f Wh", mDisplayData->totalYieldDay);
|
||||
printText(mFmtText, l_YieldDay, 25);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%7.1f kWh", mDisplayData->totalYieldTotal);
|
||||
printText(mFmtText, l_YieldTotal, 25);
|
||||
|
||||
if (mScreenSaver != 1 ) { // not practical for pixel shift screensaver
|
||||
// draw dynamic RSSI bars
|
||||
int xoffs;
|
||||
if (mScreenSaver == 1) // shrink screenwidth for pixelshift screensaver
|
||||
xoffs = pixelShiftRange/2;
|
||||
else
|
||||
xoffs = 0;
|
||||
int rssi_bar_height = 9;
|
||||
for (int i=0; i<4;i++) {
|
||||
int radio_rssi_threshold = -60 - i*10;
|
||||
int wifi_rssi_threshold = -60 - i*10;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
int radio_rssi_threshold = -60 - i * 10;
|
||||
int wifi_rssi_threshold = -60 - i * 10;
|
||||
if (mDisplayData->RadioRSSI > radio_rssi_threshold)
|
||||
mDisplay->drawBox(0, 8+(rssi_bar_height+1)*i, 4-i,rssi_bar_height);
|
||||
mDisplay->drawBox(xoffs + mPixelshift, 8 + (rssi_bar_height + 1) * i, 4 - i, rssi_bar_height);
|
||||
if (mDisplayData->WifiRSSI > wifi_rssi_threshold)
|
||||
mDisplay->drawBox(mDispWidth-4+i, 8+(rssi_bar_height+1)*i, 4-i,rssi_bar_height);
|
||||
mDisplay->drawBox(mDispWidth - 4 - xoffs + mPixelshift + i, 8 + (rssi_bar_height + 1) * i, 4 - i, rssi_bar_height);
|
||||
}
|
||||
// draw dynamic antenna and WiFi symbols
|
||||
mDisplay->setFont(u8g2_font_ncenB10_symbols10_ahoy);
|
||||
char sym[]=" ";
|
||||
sym[0] = mDisplayData->RadioSymbol?'A':'E'; // NRF
|
||||
mDisplay->drawStr(0, mLineYOffsets[l_RSSI], sym);
|
||||
mDisplay->drawStr(xoffs + mPixelshift, mLineYOffsets[l_RSSI], sym);
|
||||
|
||||
if (mDisplayData->MQTTSymbol)
|
||||
sym[0] = 'J'; // MQTT
|
||||
else
|
||||
sym[0] = mDisplayData->WifiSymbol?'B':'F'; // Wifi
|
||||
mDisplay->drawStr(mDispWidth - mDisplay->getStrWidth(sym), mLineYOffsets[l_RSSI], sym);
|
||||
mDisplay->drawStr(mDispWidth - mDisplay->getStrWidth(sym) - xoffs + mPixelshift, mLineYOffsets[l_RSSI], sym);
|
||||
mDisplay->sendBuffer();
|
||||
}
|
||||
|
||||
|
||||
mDisplay->sendBuffer();
|
||||
|
||||
|
@ -171,6 +175,8 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
l_MAX_LINES = 5,
|
||||
};
|
||||
|
||||
const uint8_t pixelShiftRange = 11; // number of pixels to shift from left to right (centered -> must be odd!)
|
||||
|
||||
void calcLinePositions() {
|
||||
uint8_t yOff = 0;
|
||||
uint8_t i = 0;
|
||||
|
@ -189,11 +195,6 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
} while(l_MAX_LINES>i);
|
||||
}
|
||||
|
||||
inline int8_t pixelshift(void) {
|
||||
int8_t range = 11; // number of pixels to shift from left to right (centered)
|
||||
return(mScreenSaver == 1 ? (mExtra % range - range/2) : 0);
|
||||
}
|
||||
|
||||
inline void setLineFont(uint8_t line) {
|
||||
if ((line == l_TotalPower) ||
|
||||
(line == l_Ahoy))
|
||||
|
@ -213,7 +214,7 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
dispX = (mDispWidth - mDisplay->getStrWidth(text)) / 2; // center text
|
||||
else
|
||||
dispX = col;
|
||||
dispX += pixelshift();
|
||||
dispX += mPixelshift;
|
||||
mDisplay->drawStr(dispX, mLineYOffsets[line], text);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -22,6 +22,7 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||
// 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);
|
||||
|
||||
calcLinePositions();
|
||||
printText("Ahoy!", 0);
|
||||
printText("ahoydtu.de", 1);
|
||||
|
@ -32,8 +33,8 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
void disp(void) {
|
||||
mDisplay->clearBuffer();
|
||||
|
||||
// set Contrast of the Display to raise the lifetime
|
||||
mDisplay->setContrast(mLuminance);
|
||||
// calculate current pixelshift for pixelshift screensaver
|
||||
calcPixelShift(pixelShiftRange);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
|
||||
if (mDisplayData->totalPower > 999)
|
||||
|
@ -67,6 +68,8 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
}
|
||||
|
||||
private:
|
||||
const uint8_t pixelShiftRange = 4; // number of pixels to shift from left to right
|
||||
|
||||
void calcLinePositions() {
|
||||
uint8_t yOff = 0;
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
|
@ -95,8 +98,8 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
}
|
||||
|
||||
void printText(const char *text, uint8_t line) {
|
||||
uint8_t dispX = 0; //small display, use all we have
|
||||
dispX += (mScreenSaver==1) ? (mExtra % 4) : 0;
|
||||
uint8_t dispX = mLineXOffsets[line] + pixelShiftRange/2 + mPixelshift;
|
||||
|
||||
setFont(line);
|
||||
mDisplay->drawStr(dispX, mLineYOffsets[line], text);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue