`DisplayDimmer` has now range 0..100 instead of 0..15 (#13132)

* ``DisplayDimmer`` has now resolution of 8 bits instead of 4, and uses Gamma for LED

* Fix changelog
This commit is contained in:
s-hadinger 2021-09-14 22:40:26 +02:00 committed by GitHub
parent 660e37d5fe
commit f4dadc625b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 100 additions and 58 deletions

View File

@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file.
### Changed ### Changed
- M5 Stack Core2 uses UNIVERSAL_DISPLAY with enabled LVGL as default now - M5 Stack Core2 uses UNIVERSAL_DISPLAY with enabled LVGL as default now
- ``DisplayDimmer`` has now range 0..100 instead of 0..15
### Fixed ### Fixed
- OpenTherm invalid JSON (#13028) - OpenTherm invalid JSON (#13028)

View File

@ -58,6 +58,11 @@ uint16_t Renderer::GetColorFromIndex(uint8_t index) {
} }
void Renderer::dim(uint8_t contrast) { void Renderer::dim(uint8_t contrast) {
uint8_t contrast8 = ((uint32_t)contrast * 255) / 15;
dim8(contrast8, contrast8);
}
void Renderer::dim8(uint8_t contrast, uint8_t contrast_gamma) {
} }

View File

@ -71,7 +71,8 @@ public:
virtual void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font); virtual void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font);
virtual void Begin(int16_t p1,int16_t p2,int16_t p3); virtual void Begin(int16_t p1,int16_t p2,int16_t p3);
virtual void Updateframe(); virtual void Updateframe();
virtual void dim(uint8_t contrast); virtual void dim(uint8_t contrast); // input has range 0..15
virtual void dim8(uint8_t contrast, uint8_t contrast_gamma); // input has range 0..255, second arg has gamma correction for PWM
virtual void pushColors(uint16_t *data, uint16_t len, boolean first); virtual void pushColors(uint16_t *data, uint16_t len, boolean first);
virtual void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); virtual void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
virtual void invertDisplay(boolean i); virtual void invertDisplay(boolean i);

View File

@ -423,9 +423,9 @@ Renderer *uDisplay::Init(void) {
if (bpanel >= 0) { if (bpanel >= 0) {
#ifdef ESP32 #ifdef ESP32
ledcSetup(ESP32_PWM_CHANNEL, 4000, 8); ledcSetup(ESP32_PWM_CHANNEL, 977, 8); // use 10 bits resolution like in Light
ledcAttachPin(bpanel, ESP32_PWM_CHANNEL); ledcAttachPin(bpanel, ESP32_PWM_CHANNEL);
ledcWrite(ESP32_PWM_CHANNEL, 128); ledcWrite(ESP32_PWM_CHANNEL, 8); // 38/255 correspond roughly to 50% visual brighness (with Gamma)
#else #else
pinMode(bpanel, OUTPUT); pinMode(bpanel, OUTPUT);
digitalWrite(bpanel, HIGH); digitalWrite(bpanel, HIGH);
@ -1343,7 +1343,7 @@ void uDisplay::DisplayOnff(int8_t on) {
if (dsp_on != 0xff) spi_command_one(dsp_on); if (dsp_on != 0xff) spi_command_one(dsp_on);
if (bpanel >= 0) { if (bpanel >= 0) {
#ifdef ESP32 #ifdef ESP32
ledcWrite(ESP32_PWM_CHANNEL, dimmer); ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
#else #else
digitalWrite(bpanel, HIGH); digitalWrite(bpanel, HIGH);
#endif #endif
@ -1386,39 +1386,38 @@ void uDisplay::invertDisplay(boolean i) {
void udisp_dimm(uint8_t dim); void udisp_dimm(uint8_t dim);
void uDisplay::dim(uint8_t dim) { // input value is 0..15
dimmer = dim; // void uDisplay::dim(uint8_t dim) {
// dim8(((uint32_t)dim * 255) / 15);
// }
// dim is 0..255
void uDisplay::dim8(uint8_t dim, uint8_t dim_gamma) { // dimmer with 8 bits resolution, 0..255. Gamma correction must be done by caller
dimmer8 = dim;
dimmer8_gamma = dim_gamma;
if (ep_mode) { if (ep_mode) {
return; return;
} }
if (interface == _UDSP_SPI) { #ifdef ESP32 // TODO should we also add a ESP8266 version for bpanel?
if (dimmer > 15) dimmer = 15; if (bpanel >= 0) { // is the BaclPanel GPIO configured
dimmer = ((float)dimmer / 15.0) * 255.0; ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
#ifdef ESP32 } else if (dim_cbp) {
if (bpanel >= 0) { dim_cbp(dim);
ledcWrite(ESP32_PWM_CHANNEL, dimmer); }
} else {
//udisp_dimm(dim);
if (dim_cbp) {
dim_cbp(dim);
}
}
#endif #endif
if (interface == _UDSP_SPI) {
if (dim_op != 0xff) { if (dim_op != 0xff) { // send SPI command if dim configured
SPI_BEGIN_TRANSACTION SPI_BEGIN_TRANSACTION
SPI_CS_LOW SPI_CS_LOW
spi_command(dim_op); spi_command(dim_op);
spi_data8(dim); spi_data8(dimmer8);
SPI_CS_HIGH SPI_CS_HIGH
SPI_END_TRANSACTION SPI_END_TRANSACTION
} }
} }
} }
// the cases are PSEUDO_OPCODES from MODULE_DESCRIPTOR // the cases are PSEUDO_OPCODES from MODULE_DESCRIPTOR
// and may be exapnded with more opcodes // and may be exapnded with more opcodes
void uDisplay::TS_RotConvert(int16_t *x, int16_t *y) { void uDisplay::TS_RotConvert(int16_t *x, int16_t *y) {

View File

@ -90,7 +90,8 @@ class uDisplay : public Renderer {
uint16_t fgcol(void); uint16_t fgcol(void);
uint16_t bgcol(void); uint16_t bgcol(void);
int8_t color_type(void); int8_t color_type(void);
void dim(uint8_t dim); // void dim(uint8_t dim); // original version with 4 bits resolution 0..15
virtual void dim8(uint8_t dim, uint8_t dim_gamma); // dimmer with 8 bits resolution, 0..255. Gamma correction must be done by caller
uint16_t GetColorFromIndex(uint8_t index); uint16_t GetColorFromIndex(uint8_t index);
void setRotation(uint8_t m); void setRotation(uint8_t m);
void fillScreen(uint16_t color); void fillScreen(uint16_t color);
@ -180,9 +181,10 @@ class uDisplay : public Renderer {
int8_t spi_clk; int8_t spi_clk;
int8_t spi_mosi; int8_t spi_mosi;
int8_t spi_dc; int8_t spi_dc;
int8_t bpanel; int8_t bpanel; // backbanel GPIO, -1 if none
int8_t spi_miso; int8_t spi_miso;
uint8_t dimmer; uint8_t dimmer8; // 8 bits resolution, 0..255
uint8_t dimmer8_gamma; // 8 bits resolution, 0..255, gamma corrected
SPIClass *uspi; SPIClass *uspi;
uint8_t sspi; uint8_t sspi;
SPISettings spiSettings; SPISettings spiSettings;

View File

@ -469,7 +469,7 @@ typedef struct {
uint8_t display_rows; // 2D5 uint8_t display_rows; // 2D5
uint8_t display_cols[2]; // 2D6 uint8_t display_cols[2]; // 2D6
uint8_t display_address[8]; // 2D8 uint8_t display_address[8]; // 2D8
uint8_t display_dimmer; // 2E0 int8_t display_dimmer_protected; // 2E0 - if positive range 0..15, if negative range 0..100 (neg) - don't use directly
uint8_t display_size; // 2E1 uint8_t display_size; // 2E1
TimeRule tflag[2]; // 2E2 TimeRule tflag[2]; // 2E2
uint16_t pwm_frequency; // 2E6 uint16_t pwm_frequency; // 2E6

View File

@ -1116,7 +1116,7 @@ void SettingsDefaultSet2(void) {
Settings->display_rows = 2; Settings->display_rows = 2;
Settings->display_cols[0] = 16; Settings->display_cols[0] = 16;
Settings->display_cols[1] = 8; Settings->display_cols[1] = 8;
Settings->display_dimmer = 1; Settings->display_dimmer_protected = -10; // 10%
Settings->display_size = 1; Settings->display_size = 1;
Settings->display_font = 1; Settings->display_font = 1;
// Settings->display_rotate = 0; // Settings->display_rotate = 0;

View File

@ -395,6 +395,30 @@ uint32_t decode_te(char *line) {
return skip; return skip;
} }
/*-------------------------------------------------------------------------------------------*/
// Getter and Setter for DisplayDimer
// Original encoding is range 0..15
// New encoding is range 0..100 using negative numbers, i.e. 0..-100
uint8_t GetDisplayDimmer(void) {
if (Settings->display_dimmer_protected > 0) {
return changeUIntScale(Settings->display_dimmer_protected, 0, 15, 0, 100);
} else {
if (Settings->display_dimmer_protected < -100) { Settings->display_dimmer_protected = -100; }
return - Settings->display_dimmer_protected;
}
}
// retro-compatible call to get range 0..15
uint8_t GetDisplayDimmer16(void) {
return changeUIntScale(GetDisplayDimmer(), 0, 100, 0, 15);
}
// In: 0..100
void SetDisplayDimmer(uint8_t dimmer) {
if (dimmer > 100) { dimmer = 100; }
Settings->display_dimmer_protected = - dimmer;
}
/*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/
#define DISPLAY_BUFFER_COLS 128 // Max number of characters in linebuf #define DISPLAY_BUFFER_COLS 128 // Max number of characters in linebuf
@ -1750,6 +1774,7 @@ void DisplayLocalSensor(void)
void DisplayInitDriver(void) void DisplayInitDriver(void)
{ {
XdspCall(FUNC_DISPLAY_INIT_DRIVER); XdspCall(FUNC_DISPLAY_INIT_DRIVER);
ApplyDisplayDimmer();
#ifdef USE_MULTI_DISPLAY #ifdef USE_MULTI_DISPLAY
Set_display(0); Set_display(0);
@ -1821,7 +1846,7 @@ void CmndDisplay(void) {
D_CMND_DISP_MODE "\":%d,\"" D_CMND_DISP_DIMMER "\":%d,\"" D_CMND_DISP_SIZE "\":%d,\"" D_CMND_DISP_FONT "\":%d,\"" D_CMND_DISP_MODE "\":%d,\"" D_CMND_DISP_DIMMER "\":%d,\"" D_CMND_DISP_SIZE "\":%d,\"" D_CMND_DISP_FONT "\":%d,\""
D_CMND_DISP_ROTATE "\":%d,\"" D_CMND_DISP_INVERT "\":%d,\"" D_CMND_DISP_REFRESH "\":%d,\"" D_CMND_DISP_COLS "\":[%d,%d],\"" D_CMND_DISP_ROWS "\":%d}}"), D_CMND_DISP_ROTATE "\":%d,\"" D_CMND_DISP_INVERT "\":%d,\"" D_CMND_DISP_REFRESH "\":%d,\"" D_CMND_DISP_COLS "\":[%d,%d],\"" D_CMND_DISP_ROWS "\":%d}}"),
Settings->display_model, Settings->display_options.type, Settings->display_width, Settings->display_height, Settings->display_model, Settings->display_options.type, Settings->display_width, Settings->display_height,
Settings->display_mode, changeUIntScale(Settings->display_dimmer, 0, 15, 0, 100), Settings->display_size, Settings->display_font, Settings->display_mode, GetDisplayDimmer(), Settings->display_size, Settings->display_font,
Settings->display_rotate, Settings->display_options.invert, Settings->display_refresh, Settings->display_cols[0], Settings->display_cols[1], Settings->display_rows); Settings->display_rotate, Settings->display_options.invert, Settings->display_refresh, Settings->display_cols[0], Settings->display_cols[1], Settings->display_rows);
} }
@ -1896,22 +1921,30 @@ void CmndDisplayMode(void) {
ResponseCmndNumber(Settings->display_mode); ResponseCmndNumber(Settings->display_mode);
} }
// Apply the current display dimmer
void ApplyDisplayDimmer(void) {
uint8_t dimmer8 = changeUIntScale(GetDisplayDimmer(), 0, 100, 0, 255);
uint8_t dimmer8_gamma = ledGamma(dimmer8);
if (dimmer8 && !(disp_power)) {
ExecuteCommandPower(disp_device, POWER_ON, SRC_DISPLAY);
}
else if (!dimmer8 && disp_power) {
ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY);
}
if (renderer) {
renderer->dim8(dimmer8, dimmer8_gamma); // provide 8 bits and gamma corrected dimmer in 8 bits
} else {
XdspCall(FUNC_DISPLAY_DIM);
}
}
void CmndDisplayDimmer(void) { void CmndDisplayDimmer(void) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
Settings->display_dimmer = changeUIntScale(XdrvMailbox.payload, 0, 100, 0, 15); // Correction for Domoticz (0 - 15) uint8_t dimmer = XdrvMailbox.payload;
if (Settings->display_dimmer && !(disp_power)) { SetDisplayDimmer(dimmer);
ExecuteCommandPower(disp_device, POWER_ON, SRC_DISPLAY); ApplyDisplayDimmer();
}
else if (!Settings->display_dimmer && disp_power) {
ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY);
}
if (renderer) {
renderer->dim(Settings->display_dimmer);
} else {
XdspCall(FUNC_DISPLAY_DIM);
}
} }
ResponseCmndNumber(changeUIntScale(Settings->display_dimmer, 0, 15, 0, 100)); ResponseCmndNumber(GetDisplayDimmer());
} }
void CmndDisplaySize(void) { void CmndDisplaySize(void) {

View File

@ -67,7 +67,7 @@ void MatrixFixed(char* txt)
matrix[i]->clear(); matrix[i]->clear();
matrix[i]->setCursor(-i *8, 0); matrix[i]->setCursor(-i *8, 0);
matrix[i]->print(txt); matrix[i]->print(txt);
matrix[i]->setBrightness(Settings->display_dimmer); matrix[i]->setBrightness(GetDisplayDimmer16());
} }
MatrixWrite(); MatrixWrite();
} }
@ -82,7 +82,7 @@ void MatrixCenter(char* txt)
matrix[i]->clear(); matrix[i]->clear();
matrix[i]->setCursor(-(i *8)+offset, 0); matrix[i]->setCursor(-(i *8)+offset, 0);
matrix[i]->print(txt); matrix[i]->print(txt);
matrix[i]->setBrightness(Settings->display_dimmer); matrix[i]->setBrightness(GetDisplayDimmer16());
} }
MatrixWrite(); MatrixWrite();
} }
@ -106,7 +106,7 @@ void MatrixScrollLeft(char* txt, int loop)
matrix[i]->clear(); matrix[i]->clear();
matrix[i]->setCursor(mtx_x - i *8, 0); matrix[i]->setCursor(mtx_x - i *8, 0);
matrix[i]->print(txt); matrix[i]->print(txt);
matrix[i]->setBrightness(Settings->display_dimmer); matrix[i]->setBrightness(GetDisplayDimmer16());
} }
MatrixWrite(); MatrixWrite();
// Move text position left by 1 pixel. // Move text position left by 1 pixel.
@ -151,7 +151,7 @@ void MatrixScrollUp(char* txt, int loop)
matrix[i]->setCursor(-i *8, mtx_y + (j *8)); matrix[i]->setCursor(-i *8, mtx_y + (j *8));
matrix[i]->println(words[j]); matrix[i]->println(words[j]);
} }
matrix[i]->setBrightness(Settings->display_dimmer); matrix[i]->setBrightness(GetDisplayDimmer16());
} }
MatrixWrite(); MatrixWrite();
if (((mtx_y %8) == 0) && mtx_counter) { if (((mtx_y %8) == 0) && mtx_counter) {
@ -172,7 +172,7 @@ void MatrixInitMode(void)
{ {
for (uint32_t i = 0; i < mtx_matrices; i++) { for (uint32_t i = 0; i < mtx_matrices; i++) {
matrix[i]->setRotation(Settings->display_rotate); // 1 matrix[i]->setRotation(Settings->display_rotate); // 1
matrix[i]->setBrightness(Settings->display_dimmer); matrix[i]->setBrightness(GetDisplayDimmer16());
matrix[i]->blinkRate(0); // 0 - 3 matrix[i]->blinkRate(0); // 0 - 3
matrix[i]->setTextWrap(false); // Allow text to run off edges matrix[i]->setTextWrap(false); // Allow text to run off edges
// matrix[i]->setTextSize(Settings->display_size); // matrix[i]->setTextSize(Settings->display_size);

View File

@ -97,7 +97,7 @@ void ILI9341_InitDriver()
#endif #endif
renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font);
renderer->dim(Settings->display_dimmer); renderer->dim(GetDisplayDimmer16());
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH
// Welcome text // Welcome text

View File

@ -72,7 +72,7 @@ void ILI9488_InitDriver(void) {
ili9488->begin(); ili9488->begin();
renderer = ili9488; renderer = ili9488;
renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
renderer->dim(Settings->display_dimmer); renderer->dim(GetDisplayDimmer16());
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH
// Welcome text // Welcome text

View File

@ -68,7 +68,7 @@ void SSD1351_InitDriver() {
ssd1351->begin(); ssd1351->begin();
renderer = ssd1351; renderer = ssd1351;
renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
renderer->dim(Settings->display_dimmer); renderer->dim(GetDisplayDimmer16());
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH
// Welcome text // Welcome text

View File

@ -61,7 +61,7 @@ void RA8876_InitDriver(void) {
ra8876->begin(); ra8876->begin();
renderer = ra8876; renderer = ra8876;
renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
renderer->dim(Settings->display_dimmer); renderer->dim(GetDisplayDimmer16());
//testall(); //testall();
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH

View File

@ -106,7 +106,7 @@ void SevensegLog(void)
void SevensegDim(void) void SevensegDim(void)
{ {
for (uint32_t i = 0; i < sevensegs; i++) { for (uint32_t i = 0; i < sevensegs; i++) {
sevenseg[i]->setBrightness(Settings->display_dimmer); sevenseg[i]->setBrightness(GetDisplayDimmer16());
} }
} }
@ -130,7 +130,7 @@ void SevensegClear(void)
void SevensegInitMode(void) void SevensegInitMode(void)
{ {
for (uint32_t i = 0; i < sevensegs; i++) { for (uint32_t i = 0; i < sevensegs; i++) {
sevenseg[i]->setBrightness(Settings->display_dimmer); sevenseg[i]->setBrightness(GetDisplayDimmer16());
sevenseg[i]->blinkRate(0); sevenseg[i]->blinkRate(0);
} }
SevensegClear(); SevensegClear();

View File

@ -93,7 +93,7 @@ void ST7789_InitDriver(void) {
st7789->init(Settings->display_width,Settings->display_height); st7789->init(Settings->display_width,Settings->display_height);
renderer = st7789; renderer = st7789;
renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
renderer->dim(Settings->display_dimmer); renderer->dim(GetDisplayDimmer16());
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH
// Welcome text // Welcome text

View File

@ -73,7 +73,7 @@ void SSD1331_InitDriver() {
renderer = ssd1331; renderer = ssd1331;
// Rotation is currently broken, https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/issues/26 // Rotation is currently broken, https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/issues/26
renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font);
renderer->dim(Settings->display_dimmer); renderer->dim(GetDisplayDimmer16());
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH
// Welcome text // Welcome text

View File

@ -233,7 +233,8 @@ void TM1637Init(void)
Settings->display_cols[0] = Settings->display_width; Settings->display_cols[0] = Settings->display_width;
Settings->display_height = 1; Settings->display_height = 1;
Settings->display_rows = Settings->display_height; Settings->display_rows = Settings->display_height;
if(!Settings->display_dimmer || Settings->display_dimmer < 2 || Settings->display_dimmer > 15) Settings->display_dimmer = 8; uint8_t dimmer16 = GetDisplayDimmer16();
if(!dimmer16 || dimmer16 < 2 || dimmer16 > 15) SetDisplayDimmer(50);
if (TM1637 == TM1637Data.display_type) if (TM1637 == TM1637Data.display_type)
{ {
@ -1074,8 +1075,8 @@ bool TM1637MainFunc(uint8_t fn)
void TM1637Dim(void) void TM1637Dim(void)
{ {
// Settings->display_dimmer = 0 - 15 // GetDisplayDimmer16() = 0 - 15
uint8_t brightness = Settings->display_dimmer >> 1; // 0 - 7 uint8_t brightness = GetDisplayDimmer16() >> 1; // 0 - 7
if (TM1637 == TM1637Data.display_type) if (TM1637 == TM1637Data.display_type)
{ {

View File

@ -312,7 +312,7 @@ uDisplay *udisp;
#endif #endif
renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font); renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font);
renderer->dim(Settings->display_dimmer); ApplyDisplayDimmer();
#ifdef SHOW_SPLASH #ifdef SHOW_SPLASH
renderer->Splash(); renderer->Splash();