Epaper deep sleep support (#17766)

* allow descriptor reload

* restart reason rrsn, database rewrite

* support for deep sleep

* revert

* restart reason
This commit is contained in:
gemu 2023-01-22 10:56:06 +01:00 committed by GitHub
parent 8b96f68a5b
commit d38a0c799c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 17 deletions

View File

@ -52,11 +52,28 @@ int8_t uDisplay::color_type(void) {
return col_type; return col_type;
} }
uDisplay::~uDisplay(void) { uDisplay::~uDisplay(void) {
if (framebuffer) { #ifdef UDSP_DEBUG
free(framebuffer); Serial.printf("dealloc\n");
#endif
if (frame_buffer) {
free(frame_buffer);
} }
if (lut_full) {
free(lut_full);
}
if (lut_partial) {
free(lut_partial);
}
for (uint16_t cnt = 0; cnt < MAX_LUTS; cnt++ ) {
if (lut_array[cnt]) {
free(lut_array[cnt]);
}
}
#ifdef USE_ESP32_S3 #ifdef USE_ESP32_S3
if (_dmadesc) { if (_dmadesc) {
heap_caps_free(_dmadesc); heap_caps_free(_dmadesc);
@ -66,18 +83,6 @@ uDisplay::~uDisplay(void) {
if (_i80_bus) { if (_i80_bus) {
esp_lcd_del_i80_bus(_i80_bus); esp_lcd_del_i80_bus(_i80_bus);
} }
if (lut_full) {
free(lut_full);
}
if (lut_partial) {
free(lut_partial);
}
for (uint16_t cnt = 0; cnt < MAX_LUTS; cnt++ ) {
if (lut_array[cnt]) {
free(lut_array[cnt]);
}
}
#endif // USE_ESP32_S3 #endif // USE_ESP32_S3
} }
@ -124,7 +129,10 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
for (uint32_t cnt = 0; cnt < MAX_LUTS; cnt++) { for (uint32_t cnt = 0; cnt < MAX_LUTS; cnt++) {
lut_cnt[cnt] = 0; lut_cnt[cnt] = 0;
lut_cmd[cnt] = 0xff; lut_cmd[cnt] = 0xff;
lut_array[cnt] = 0;
} }
lut_partial = 0;
lut_full = 0;
char linebuff[128]; char linebuff[128];
while (*lp) { while (*lp) {
@ -498,7 +506,7 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
} }
#ifdef UDSP_DEBUG #ifdef UDSP_DEBUG
Serial.printf("Device : %s\n", dname);
Serial.printf("xs : %d\n", gxs); Serial.printf("xs : %d\n", gxs);
Serial.printf("ys : %d\n", gys); Serial.printf("ys : %d\n", gys);
Serial.printf("bpp: %d\n", bpp); Serial.printf("bpp: %d\n", bpp);
@ -635,6 +643,10 @@ void uDisplay::delay_arg(uint32_t args) {
#define EP_SEND_DATA 0x66 #define EP_SEND_DATA 0x66
#define EP_CLR_FRAME 0x67 #define EP_CLR_FRAME 0x67
#define EP_SEND_FRAME 0x68 #define EP_SEND_FRAME 0x68
#define EP_BREAK_RR_EQU 0x69
#define EP_BREAK_RR_NEQ 0x6a
extern int32_t ESP_ResetInfoReason();
void uDisplay::send_spi_cmds(uint16_t cmd_offset, uint16_t cmd_size) { void uDisplay::send_spi_cmds(uint16_t cmd_offset, uint16_t cmd_size) {
uint16_t index = 0; uint16_t index = 0;
@ -692,6 +704,26 @@ uint16_t index = 0;
case EP_SEND_FRAME: case EP_SEND_FRAME:
SetFrameMemory(framebuffer); SetFrameMemory(framebuffer);
break; break;
case EP_BREAK_RR_EQU:
if (args & 1) {
iob = dsp_cmds[cmd_offset++];
index++;
if (iob == ESP_ResetInfoReason()) {
ep_update_mode = DISPLAY_INIT_PARTIAL;
goto exit;
}
}
break;
case EP_BREAK_RR_NEQ:
if (args & 1) {
iob = dsp_cmds[cmd_offset++];
index++;
if (iob != ESP_ResetInfoReason()) {
ep_update_mode = DISPLAY_INIT_PARTIAL;
goto exit;
}
}
break;
} }
#ifdef UDSP_DEBUG #ifdef UDSP_DEBUG
if (args & 1) { if (args & 1) {
@ -731,9 +763,12 @@ uint16_t index = 0;
} }
if (index >= cmd_size) break; if (index >= cmd_size) break;
} }
exit:
#ifdef UDSP_DEBUG #ifdef UDSP_DEBUG
Serial.printf("end send cmd table\n"); Serial.printf("end send cmd table\n");
#endif #endif
return;
} }
Renderer *uDisplay::Init(void) { Renderer *uDisplay::Init(void) {
@ -756,6 +791,7 @@ Renderer *uDisplay::Init(void) {
} }
#endif // ESP8266 #endif // ESP8266
} }
frame_buffer = framebuffer;
if (interface == _UDSP_I2C) { if (interface == _UDSP_I2C) {
if (wire_n == 0) { if (wire_n == 0) {

View File

@ -301,6 +301,7 @@ class uDisplay : public Renderer {
uint8_t lut_siz_full; uint8_t lut_siz_full;
uint8_t *lut_partial; uint8_t *lut_partial;
uint8_t lut_siz_partial; uint8_t lut_siz_partial;
uint8_t *frame_buffer;
uint8_t epcoffs_full; uint8_t epcoffs_full;
uint8_t epc_full_cnt; uint8_t epc_full_cnt;

View File

@ -4124,6 +4124,10 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
} }
goto strexit; goto strexit;
} }
if (!strncmp(lp, "rrsn", 4)) {
fvar = ESP_ResetInfoReason();
goto exit;
}
if (!strncmp(lp, "rax", 3)) { if (!strncmp(lp, "rax", 3)) {
TasmotaGlobal.no_autoexec = 0; TasmotaGlobal.no_autoexec = 0;
goto exit; goto exit;

View File

@ -636,7 +636,9 @@ void DisplayText(void)
model = Settings->display_model; model = Settings->display_model;
fp.read((uint8_t*)fdesc, size); fp.read((uint8_t*)fdesc, size);
fp.close(); fp.close();
Renderer *svptr = renderer;
Get_display(temp); Get_display(temp);
renderer = svptr;
if (rot >= 0) { if (rot >= 0) {
srot = Settings->display_rotate; srot = Settings->display_rotate;
Settings->display_rotate = rot; Settings->display_rotate = rot;
@ -646,7 +648,7 @@ void DisplayText(void)
Settings->display_rotate = srot; Settings->display_rotate = srot;
} }
Set_display(temp); Set_display(temp);
AddLog(LOG_LEVEL_INFO, PSTR("DSP: File descriptor loaded %x"),renderer); AddLog(LOG_LEVEL_INFO, PSTR("DSP: File descriptor loaded"));
free(fdesc); free(fdesc);
Settings->display_model = model; Settings->display_model = model;
} }