``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
- M5 Stack Core2 uses UNIVERSAL_DISPLAY with enabled LVGL as default now
- ``DisplayDimmer`` has now range 0..100 instead of 0..15
### Fixed
- OpenTherm invalid JSON (#13028)

View File

@ -58,6 +58,11 @@ uint16_t Renderer::GetColorFromIndex(uint8_t index) {
}
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 Begin(int16_t p1,int16_t p2,int16_t p3);
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 setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
virtual void invertDisplay(boolean i);

View File

@ -423,9 +423,9 @@ Renderer *uDisplay::Init(void) {
if (bpanel >= 0) {
#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);
ledcWrite(ESP32_PWM_CHANNEL, 128);
ledcWrite(ESP32_PWM_CHANNEL, 8); // 38/255 correspond roughly to 50% visual brighness (with Gamma)
#else
pinMode(bpanel, OUTPUT);
digitalWrite(bpanel, HIGH);
@ -1343,7 +1343,7 @@ void uDisplay::DisplayOnff(int8_t on) {
if (dsp_on != 0xff) spi_command_one(dsp_on);
if (bpanel >= 0) {
#ifdef ESP32
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
#else
digitalWrite(bpanel, HIGH);
#endif
@ -1386,39 +1386,38 @@ void uDisplay::invertDisplay(boolean i) {
void udisp_dimm(uint8_t dim);
void uDisplay::dim(uint8_t dim) {
dimmer = dim;
// input value is 0..15
// 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) {
return;
}
if (interface == _UDSP_SPI) {
if (dimmer > 15) dimmer = 15;
dimmer = ((float)dimmer / 15.0) * 255.0;
#ifdef ESP32
if (bpanel >= 0) {
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
} else {
//udisp_dimm(dim);
if (dim_cbp) {
dim_cbp(dim);
}
}
#ifdef ESP32 // TODO should we also add a ESP8266 version for bpanel?
if (bpanel >= 0) { // is the BaclPanel GPIO configured
ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
} else if (dim_cbp) {
dim_cbp(dim);
}
#endif
if (dim_op != 0xff) {
if (interface == _UDSP_SPI) {
if (dim_op != 0xff) { // send SPI command if dim configured
SPI_BEGIN_TRANSACTION
SPI_CS_LOW
spi_command(dim_op);
spi_data8(dim);
spi_data8(dimmer8);
SPI_CS_HIGH
SPI_END_TRANSACTION
}
}
}
// the cases are PSEUDO_OPCODES from MODULE_DESCRIPTOR
// and may be exapnded with more opcodes
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 bgcol(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);
void setRotation(uint8_t m);
void fillScreen(uint16_t color);
@ -180,9 +181,10 @@ class uDisplay : public Renderer {
int8_t spi_clk;
int8_t spi_mosi;
int8_t spi_dc;
int8_t bpanel;
int8_t bpanel; // backbanel GPIO, -1 if none
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;
uint8_t sspi;
SPISettings spiSettings;

View File

@ -469,7 +469,7 @@ typedef struct {
uint8_t display_rows; // 2D5
uint8_t display_cols[2]; // 2D6
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
TimeRule tflag[2]; // 2E2
uint16_t pwm_frequency; // 2E6

View File

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

View File

@ -395,6 +395,30 @@ uint32_t decode_te(char *line) {
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
@ -1750,6 +1774,7 @@ void DisplayLocalSensor(void)
void DisplayInitDriver(void)
{
XdspCall(FUNC_DISPLAY_INIT_DRIVER);
ApplyDisplayDimmer();
#ifdef USE_MULTI_DISPLAY
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_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_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);
}
@ -1896,22 +1921,30 @@ void CmndDisplayMode(void) {
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) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
Settings->display_dimmer = changeUIntScale(XdrvMailbox.payload, 0, 100, 0, 15); // Correction for Domoticz (0 - 15)
if (Settings->display_dimmer && !(disp_power)) {
ExecuteCommandPower(disp_device, POWER_ON, SRC_DISPLAY);
}
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);
}
uint8_t dimmer = XdrvMailbox.payload;
SetDisplayDimmer(dimmer);
ApplyDisplayDimmer();
}
ResponseCmndNumber(changeUIntScale(Settings->display_dimmer, 0, 15, 0, 100));
ResponseCmndNumber(GetDisplayDimmer());
}
void CmndDisplaySize(void) {

View File

@ -67,7 +67,7 @@ void MatrixFixed(char* txt)
matrix[i]->clear();
matrix[i]->setCursor(-i *8, 0);
matrix[i]->print(txt);
matrix[i]->setBrightness(Settings->display_dimmer);
matrix[i]->setBrightness(GetDisplayDimmer16());
}
MatrixWrite();
}
@ -82,7 +82,7 @@ void MatrixCenter(char* txt)
matrix[i]->clear();
matrix[i]->setCursor(-(i *8)+offset, 0);
matrix[i]->print(txt);
matrix[i]->setBrightness(Settings->display_dimmer);
matrix[i]->setBrightness(GetDisplayDimmer16());
}
MatrixWrite();
}
@ -106,7 +106,7 @@ void MatrixScrollLeft(char* txt, int loop)
matrix[i]->clear();
matrix[i]->setCursor(mtx_x - i *8, 0);
matrix[i]->print(txt);
matrix[i]->setBrightness(Settings->display_dimmer);
matrix[i]->setBrightness(GetDisplayDimmer16());
}
MatrixWrite();
// 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]->println(words[j]);
}
matrix[i]->setBrightness(Settings->display_dimmer);
matrix[i]->setBrightness(GetDisplayDimmer16());
}
MatrixWrite();
if (((mtx_y %8) == 0) && mtx_counter) {
@ -172,7 +172,7 @@ void MatrixInitMode(void)
{
for (uint32_t i = 0; i < mtx_matrices; i++) {
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]->setTextWrap(false); // Allow text to run off edges
// matrix[i]->setTextSize(Settings->display_size);

View File

@ -97,7 +97,7 @@ void ILI9341_InitDriver()
#endif
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
// Welcome text

View File

@ -72,7 +72,7 @@ void ILI9488_InitDriver(void) {
ili9488->begin();
renderer = ili9488;
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
// Welcome text

View File

@ -68,7 +68,7 @@ void SSD1351_InitDriver() {
ssd1351->begin();
renderer = ssd1351;
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
// Welcome text

View File

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

View File

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

View File

@ -93,7 +93,7 @@ void ST7789_InitDriver(void) {
st7789->init(Settings->display_width,Settings->display_height);
renderer = st7789;
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
// Welcome text

View File

@ -73,7 +73,7 @@ void SSD1331_InitDriver() {
renderer = ssd1331;
// 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->dim(Settings->display_dimmer);
renderer->dim(GetDisplayDimmer16());
#ifdef SHOW_SPLASH
// Welcome text

View File

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

View File

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