Fiddle with brightness
Add new function setBrightness() #366 Takes a value of 0-255
This commit is contained in:
parent
765d99ea63
commit
9ca210d3ac
2 changed files with 166 additions and 26 deletions
|
@ -567,7 +567,8 @@ void MatrixPanel_I2S_DMA::clearFrameBuffer(bool _buff_id){
|
||||||
#endif
|
#endif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
row[ESP32_TX_FIFO_POSITION_ADJUST(0 + _blank)] |= BIT_OE;
|
row[ESP32_TX_FIFO_POSITION_ADJUST(0 + _blank)] |= BIT_OE; // disable output
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(dma_buff.rowBits[row_idx]->width - 1)] |= BIT_OE; // disable output
|
||||||
row[ESP32_TX_FIFO_POSITION_ADJUST(dma_buff.rowBits[row_idx]->width - _blank - 1)] |= BIT_OE; // (LAT pulse is (width-2) -1 pixel to compensate array index starting at 0
|
row[ESP32_TX_FIFO_POSITION_ADJUST(dma_buff.rowBits[row_idx]->width - _blank - 1)] |= BIT_OE; // (LAT pulse is (width-2) -1 pixel to compensate array index starting at 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -591,6 +592,7 @@ void MatrixPanel_I2S_DMA::clearFrameBuffer(bool _buff_id){
|
||||||
* @param _buff_id - buffer id to control
|
* @param _buff_id - buffer id to control
|
||||||
*/
|
*/
|
||||||
void MatrixPanel_I2S_DMA::brtCtrlOE(int brt, const bool _buff_id){
|
void MatrixPanel_I2S_DMA::brtCtrlOE(int brt, const bool _buff_id){
|
||||||
|
/*
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -643,16 +645,7 @@ void MatrixPanel_I2S_DMA::brtCtrlOE(int brt, const bool _buff_id){
|
||||||
uint8_t _blank = m_cfg.latch_blanking;
|
uint8_t _blank = m_cfg.latch_blanking;
|
||||||
do {
|
do {
|
||||||
--_blank;
|
--_blank;
|
||||||
/*
|
|
||||||
#if defined(ESP32_THE_ORIG)
|
|
||||||
// Original ESP32 WROOM FIFO Ordering Sucks
|
|
||||||
uint8_t _blank_row_tx_fifo_tmp = 0 + _blank;
|
|
||||||
(_blank_row_tx_fifo_tmp & 1U) ? --_blank_row_tx_fifo_tmp : ++_blank_row_tx_fifo_tmp;
|
|
||||||
row[_blank_row_tx_fifo_tmp] |= BIT_OE;
|
|
||||||
#else
|
|
||||||
row[0 + _blank] |= BIT_OE;
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
row[ESP32_TX_FIFO_POSITION_ADJUST(0 + _blank)] |= BIT_OE;
|
row[ESP32_TX_FIFO_POSITION_ADJUST(0 + _blank)] |= BIT_OE;
|
||||||
|
|
||||||
|
@ -673,6 +666,104 @@ void MatrixPanel_I2S_DMA::brtCtrlOE(int brt, const bool _buff_id){
|
||||||
|
|
||||||
|
|
||||||
} while(row_idx);
|
} while(row_idx);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief - reset OE bits in DMA buffer in a way to control brightness
|
||||||
|
* @param brt - brightness level from 0 to 255 - NOT MATRIX_WIDTH
|
||||||
|
* @param _buff_id - buffer id to control
|
||||||
|
*/
|
||||||
|
void MatrixPanel_I2S_DMA::brtCtrlOEv2(uint8_t brt, const int _buff_id) {
|
||||||
|
|
||||||
|
if (!initialized)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
int x_coord_oe_adjust_stop_point = PIXELS_PER_ROW -
|
||||||
|
|
||||||
|
if (brt > PIXELS_PER_ROW - (MAX_LAT_BLANKING + 2)) // can't control values larger than (row_width - latch_blanking) to avoid ongoing issues being raised about brightness and ghosting.
|
||||||
|
brt = PIXELS_PER_ROW - (MAX_LAT_BLANKING + 2); // +2 for a bit of buffer...
|
||||||
|
|
||||||
|
if (brt < 0)
|
||||||
|
brt = 0;
|
||||||
|
*/
|
||||||
|
|
||||||
|
int brightness_in_x_pixels = PIXELS_PER_ROW * ((float)brt/256);
|
||||||
|
|
||||||
|
Serial.println(brightness_in_x_pixels, DEC);
|
||||||
|
uint8_t _blank = m_cfg.latch_blanking; // don't want to inadvertantly blast over this
|
||||||
|
|
||||||
|
|
||||||
|
// start with iterating all rows in dma_buff structure
|
||||||
|
int row_idx = dma_buff.rowBits.size();
|
||||||
|
do {
|
||||||
|
--row_idx;
|
||||||
|
|
||||||
|
// let's set OE control bits for specific pixels in each color_index subrows
|
||||||
|
uint8_t colouridx = dma_buff.rowBits[row_idx]->colour_depth;
|
||||||
|
do {
|
||||||
|
--colouridx;
|
||||||
|
|
||||||
|
// switch pointer to a row for a specific color index
|
||||||
|
ESP32_I2S_DMA_STORAGE_TYPE* row = dma_buff.rowBits[row_idx]->getDataPtr(colouridx, _buff_id);
|
||||||
|
|
||||||
|
int x_coord = dma_buff.rowBits[row_idx]->width;
|
||||||
|
do {
|
||||||
|
--x_coord;
|
||||||
|
|
||||||
|
if (x_coord <= _blank) // Can't touch blanking. They need to stay blank.
|
||||||
|
{
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] |= BIT_OE; // Disable output after this point.
|
||||||
|
}
|
||||||
|
else if(x_coord >= (PIXELS_PER_ROW - _blank - 1) ) // Can't touch blanking. They need to stay blank.
|
||||||
|
{
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] |= BIT_OE; // Disable output after this point.
|
||||||
|
}
|
||||||
|
else if (x_coord < brightness_in_x_pixels)
|
||||||
|
{
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] &= BITMASK_OE_CLEAR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] |= BIT_OE; // Disable output after this point.
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear OE bit for all other pixels (that is, turn on output)
|
||||||
|
//row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] &= BITMASK_OE_CLEAR;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
// Brightness control via OE toggle - disable matrix output at specified x_coord
|
||||||
|
if((colouridx > lsbMsbTransitionBit || !colouridx) && ((x_coord) >= brt)){
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] |= BIT_OE; // Disable output after this point.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// special case for the bits *after* LSB through (lsbMsbTransitionBit) - OE is output after data is shifted, so need to set OE to fractional brightness
|
||||||
|
if(colouridx && colouridx <= lsbMsbTransitionBit) {
|
||||||
|
// divide brightness in half for each bit below lsbMsbTransitionBit
|
||||||
|
int lsbBrightness = brt >> (lsbMsbTransitionBit - colouridx + 1);
|
||||||
|
if((x_coord) >= lsbBrightness) {
|
||||||
|
row[ESP32_TX_FIFO_POSITION_ADJUST(x_coord)] |= BIT_OE; // Disable output after this point.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
} while(x_coord);
|
||||||
|
|
||||||
|
} while(colouridx);
|
||||||
|
|
||||||
|
// switch pointer to a row for a specific color index
|
||||||
|
#if defined(SPIRAM_DMA_BUFFER)
|
||||||
|
ESP32_I2S_DMA_STORAGE_TYPE* row_hack = dma_buff.rowBits[row_idx]->getDataPtr(colouridx, _buff_id);
|
||||||
|
Cache_WriteBack_Addr((uint32_t)row_hack, sizeof(ESP32_I2S_DMA_STORAGE_TYPE) * ((dma_buff.rowBits[row_idx]->width * dma_buff.rowBits[row_idx]->colour_depth)-1)) ;
|
||||||
|
#endif
|
||||||
|
} while(row_idx);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -712,7 +803,9 @@ uint8_t MatrixPanel_I2S_DMA::setLatBlanking(uint8_t pulses){
|
||||||
pulses = DEFAULT_LAT_BLANKING;
|
pulses = DEFAULT_LAT_BLANKING;
|
||||||
|
|
||||||
m_cfg.latch_blanking = pulses;
|
m_cfg.latch_blanking = pulses;
|
||||||
setPanelBrightness(brightness); // set brightness to reset OE bits to the values matching new LAT blanking setting
|
|
||||||
|
// remove brightness var for now.
|
||||||
|
//setPanelBrightness(brightness); // set brightness to reset OE bits to the values matching new LAT blanking setting
|
||||||
return m_cfg.latch_blanking;
|
return m_cfg.latch_blanking;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -720,8 +813,8 @@ uint8_t MatrixPanel_I2S_DMA::setLatBlanking(uint8_t pulses){
|
||||||
#ifndef NO_FAST_FUNCTIONS
|
#ifndef NO_FAST_FUNCTIONS
|
||||||
/**
|
/**
|
||||||
* @brief - update DMA buff drawing horizontal line at specified coordinates
|
* @brief - update DMA buff drawing horizontal line at specified coordinates
|
||||||
* @param x_ccord - line start coordinate x
|
* @param x_coord - line start coordinate x
|
||||||
* @param y_ccord - line start coordinate y
|
* @param y_coord - line start coordinate y
|
||||||
* @param l - line length
|
* @param l - line length
|
||||||
* @param r,g,b, - RGB888 color
|
* @param r,g,b, - RGB888 color
|
||||||
*/
|
*/
|
||||||
|
@ -807,8 +900,8 @@ void MatrixPanel_I2S_DMA::hlineDMA(int16_t x_coord, int16_t y_coord, int16_t l,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief - update DMA buff drawing vertical line at specified coordinates
|
* @brief - update DMA buff drawing vertical line at specified coordinates
|
||||||
* @param x_ccord - line start coordinate x
|
* @param x_coord - line start coordinate x
|
||||||
* @param y_ccord - line start coordinate y
|
* @param y_coord - line start coordinate y
|
||||||
* @param l - line length
|
* @param l - line length
|
||||||
* @param r,g,b, - RGB888 color
|
* @param r,g,b, - RGB888 color
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -490,17 +490,53 @@ class MatrixPanel_I2S_DMA {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void setPanelBrightness(int b)
|
/**
|
||||||
|
* this is just a wrapper to control brightness
|
||||||
|
* with an 8-bit value (0-255), very popular in FastLED-based sketches :)
|
||||||
|
* @param uint8_t b - 8-bit brightness value
|
||||||
|
*/
|
||||||
|
void setBrightness(const uint8_t b)
|
||||||
{
|
{
|
||||||
// Change to set the brightness of the display, range of 1 to matrixWidth (i.e. 1 - 64)
|
|
||||||
brightness = b;
|
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
|
{
|
||||||
|
ESP_LOGI("setBrightness()", "Tried to set output brightness before begin()");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
brightness = b;
|
||||||
|
brtCtrlOEv2(b, 0);
|
||||||
|
|
||||||
|
if (m_cfg.double_buff) {
|
||||||
|
brtCtrlOEv2(b, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Takes a value that is between 0 and MATRIX_WIDTH-1
|
||||||
|
/*
|
||||||
|
void setPanelBrightness(int b)
|
||||||
|
{
|
||||||
|
if (!initialized)
|
||||||
|
{
|
||||||
|
ESP_LOGI("setPanelBrightness()", "Tried to set output brightness before begin()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change to set the brightness of the display, range of 1 to matrixWidth (i.e. 1 - 64)
|
||||||
|
// brightness = b * PIXELS_PER_ROW / 256;
|
||||||
|
|
||||||
brtCtrlOE(b);
|
brtCtrlOE(b);
|
||||||
if (m_cfg.double_buff)
|
if (m_cfg.double_buff)
|
||||||
brtCtrlOE(b, 1);
|
brtCtrlOE(b, 1);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Takes a value between 0-255 now.
|
||||||
|
void setPanelBrightness(uint8_t b)
|
||||||
|
{
|
||||||
|
setBrightness(b);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this is just a wrapper to control brightness
|
* this is just a wrapper to control brightness
|
||||||
|
@ -509,7 +545,8 @@ class MatrixPanel_I2S_DMA {
|
||||||
*/
|
*/
|
||||||
void setBrightness8(const uint8_t b)
|
void setBrightness8(const uint8_t b)
|
||||||
{
|
{
|
||||||
setPanelBrightness(b * PIXELS_PER_ROW / 256);
|
setBrightness(b);
|
||||||
|
//setPanelBrightness(b * PIXELS_PER_ROW / 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -580,11 +617,14 @@ class MatrixPanel_I2S_DMA {
|
||||||
*/
|
*/
|
||||||
inline void resetbuffers(){
|
inline void resetbuffers(){
|
||||||
clearFrameBuffer();
|
clearFrameBuffer();
|
||||||
brtCtrlOE(brightness);
|
|
||||||
|
brtCtrlOEv2(brightness, 0);
|
||||||
|
|
||||||
if (m_cfg.double_buff){
|
if (m_cfg.double_buff){
|
||||||
clearFrameBuffer(1);
|
clearFrameBuffer(1);
|
||||||
brtCtrlOE(brightness, 1);
|
brtCtrlOEv2(brightness, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -635,7 +675,7 @@ class MatrixPanel_I2S_DMA {
|
||||||
bool initialized = false;
|
bool initialized = false;
|
||||||
int active_gfx_writes = 0; // How many async routines are 'drawing' (writing) to the DMA bit buffer. Function called from Adafruit_GFX draw routines like drawCircle etc.
|
int active_gfx_writes = 0; // How many async routines are 'drawing' (writing) to the DMA bit buffer. Function called from Adafruit_GFX draw routines like drawCircle etc.
|
||||||
int back_buffer_id = 0; // If using double buffer, which one is NOT active (ie. being displayed) to write too?
|
int back_buffer_id = 0; // If using double buffer, which one is NOT active (ie. being displayed) to write too?
|
||||||
int brightness = 32; // If you get ghosting... reduce brightness level. 60 seems to be the limit before ghosting on a 64 pixel wide physical panel for some panels.
|
int brightness = 128; // If you get ghosting... reduce brightness level. ((60/64)*255) seems to be the limit before ghosting on a 64 pixel wide physical panel for some panels.
|
||||||
int lsbMsbTransitionBit = 0; // For colour depth calculations
|
int lsbMsbTransitionBit = 0; // For colour depth calculations
|
||||||
|
|
||||||
|
|
||||||
|
@ -680,6 +720,13 @@ class MatrixPanel_I2S_DMA {
|
||||||
*/
|
*/
|
||||||
void brtCtrlOE(int brt, const bool _buff_id=0);
|
void brtCtrlOE(int brt, const bool _buff_id=0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief - reset OE bits in DMA buffer in a way to control brightness
|
||||||
|
* @param brt - brightness level from 0 to row_width
|
||||||
|
* @param _buff_id - buffer id to control
|
||||||
|
*/
|
||||||
|
void brtCtrlOEv2(uint8_t brt, const int _buff_id=0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue