mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-27 05:06:44 +00:00
Optimize screen update
This commit is contained in:
parent
7cb167a632
commit
2fadd2da50
123
src/hasp_gui.cpp
123
src/hasp_gui.cpp
@ -64,7 +64,7 @@ static Ticker tick; /* timer for interrupt handler */
|
|||||||
static TFT_eSPI tft; // = TFT_eSPI(); /* TFT instance */
|
static TFT_eSPI tft; // = TFT_eSPI(); /* TFT instance */
|
||||||
static uint16_t calData[5] = {0, 65535, 0, 65535, 0};
|
static uint16_t calData[5] = {0, 65535, 0, 65535, 0};
|
||||||
|
|
||||||
bool guiCheckSleep()
|
static bool guiCheckSleep()
|
||||||
{
|
{
|
||||||
uint32_t idle = lv_disp_get_inactive_time(NULL);
|
uint32_t idle = lv_disp_get_inactive_time(NULL);
|
||||||
if(idle >= (guiSleepTime1 + guiSleepTime2) * 1000U) {
|
if(idle >= (guiSleepTime1 + guiSleepTime2) * 1000U) {
|
||||||
@ -87,14 +87,99 @@ bool guiCheckSleep()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gui_take_screenshot(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
||||||
|
{
|
||||||
|
uint i = 0;
|
||||||
|
uint16_t c;
|
||||||
|
uint8_t pixel[1024];
|
||||||
|
|
||||||
|
for(int y = area->y1; y <= area->y2; y++) {
|
||||||
|
for(int x = area->x1; x <= area->x2; x++) {
|
||||||
|
/* Function for converting LittlevGL pixel format to RGB888 */
|
||||||
|
// data = DISP_IMPL_lvgl_formatPixel(*color_p);
|
||||||
|
|
||||||
|
// Complex 32 bpp
|
||||||
|
/* pixel[i++] = (LV_COLOR_GET_B(*color_p) * 263 + 7) >> 5;
|
||||||
|
pixel[i++] = (LV_COLOR_GET_G(*color_p) * 259 + 3) >> 6;
|
||||||
|
pixel[i++] = (LV_COLOR_GET_R(*color_p) * 263 + 7) >> 5;
|
||||||
|
pixel[i++] = 0xFF;*/
|
||||||
|
|
||||||
|
// Simple 32 bpp
|
||||||
|
// pixel[i++] = (LV_COLOR_GET_B(*color_p) << 3);
|
||||||
|
// pixel[i++] = (LV_COLOR_GET_G(*color_p) << 2);
|
||||||
|
// pixel[i++] = (LV_COLOR_GET_R(*color_p) << 3);
|
||||||
|
// pixel[i++] = 0xFF;
|
||||||
|
|
||||||
|
c = color_p->full;
|
||||||
|
|
||||||
|
// Simple 16 bpp
|
||||||
|
pixel[i++] = c & 0xFF;
|
||||||
|
pixel[i++] = (c >> 8) & 0xFF;
|
||||||
|
|
||||||
|
color_p++;
|
||||||
|
|
||||||
|
if(i + 4 >= sizeof(pixel)) {
|
||||||
|
switch(guiSnapshot) {
|
||||||
|
case 1:
|
||||||
|
// Save to local file
|
||||||
|
pFileOut.write(pixel, i);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// Send to remote client
|
||||||
|
if(webClient->client().write(pixel, i) != i) {
|
||||||
|
Log.warning(F("GUI: Pixelbuffer not completely sent"));
|
||||||
|
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i > 0) {
|
||||||
|
switch(guiSnapshot) {
|
||||||
|
case 1:
|
||||||
|
// Save to local file
|
||||||
|
pFileOut.write(pixel, i);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// Send to remote client
|
||||||
|
if(webClient->client().write(pixel, i) != i) {
|
||||||
|
Log.warning(F("GUI: Pixelbuffer not completely sent"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Experimetnal Display flushing */
|
||||||
|
static void IRAM_ATTR tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
||||||
|
{
|
||||||
|
/* Update TFT */
|
||||||
|
tft.startWrite(); /* Start new TFT transaction */
|
||||||
|
tft.setWindow(area->x1, area->y1, area->x2, area->y2); /* set the working window */
|
||||||
|
tft.setSwapBytes(true); // endianess
|
||||||
|
tft.pushPixels((uint16_t *)color_p, (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1));
|
||||||
|
tft.endWrite(); /* terminate TFT transaction */
|
||||||
|
|
||||||
|
/* Send Screenshot data */
|
||||||
|
if(guiSnapshot != 0) {
|
||||||
|
gui_take_screenshot(disp, area, color_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tell lvgl that flushing is done */
|
||||||
|
lv_disp_flush_ready(disp);
|
||||||
|
}
|
||||||
|
|
||||||
/* Display flushing */
|
/* Display flushing */
|
||||||
|
/*
|
||||||
void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
||||||
{
|
{
|
||||||
uint16_t c;
|
uint16_t c;
|
||||||
|
|
||||||
tft.startWrite(); /* Start new TFT transaction */
|
tft.startWrite(); // Start new TFT transaction
|
||||||
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1),
|
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1),
|
||||||
(area->y2 - area->y1 + 1)); /* set the working window */
|
(area->y2 - area->y1 + 1)); // set the working window
|
||||||
|
|
||||||
if(guiSnapshot != 0) {
|
if(guiSnapshot != 0) {
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
@ -102,14 +187,14 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
|
|||||||
|
|
||||||
for(int y = area->y1; y <= area->y2; y++) {
|
for(int y = area->y1; y <= area->y2; y++) {
|
||||||
for(int x = area->x1; x <= area->x2; x++) {
|
for(int x = area->x1; x <= area->x2; x++) {
|
||||||
/* Function for converting LittlevGL pixel format to RGB888 */
|
// Function for converting LittlevGL pixel format to RGB888
|
||||||
// data = DISP_IMPL_lvgl_formatPixel(*color_p);
|
// data = DISP_IMPL_lvgl_formatPixel(*color_p);
|
||||||
|
|
||||||
// Complex 32 bpp
|
// Complex 32 bpp
|
||||||
/* pixel[i++] = (LV_COLOR_GET_B(*color_p) * 263 + 7) >> 5;
|
// pixel[i++] = (LV_COLOR_GET_B(*color_p) * 263 + 7) >> 5;
|
||||||
pixel[i++] = (LV_COLOR_GET_G(*color_p) * 259 + 3) >> 6;
|
// pixel[i++] = (LV_COLOR_GET_G(*color_p) * 259 + 3) >> 6;
|
||||||
pixel[i++] = (LV_COLOR_GET_R(*color_p) * 263 + 7) >> 5;
|
// pixel[i++] = (LV_COLOR_GET_R(*color_p) * 263 + 7) >> 5;
|
||||||
pixel[i++] = 0xFF;*/
|
// pixel[i++] = 0xFF;
|
||||||
|
|
||||||
// Simple 32 bpp
|
// Simple 32 bpp
|
||||||
// pixel[i++] = (LV_COLOR_GET_B(*color_p) << 3);
|
// pixel[i++] = (LV_COLOR_GET_B(*color_p) << 3);
|
||||||
@ -136,7 +221,7 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
|
|||||||
// Send to remote client
|
// Send to remote client
|
||||||
if(webClient->client().write(pixel, i) != i) {
|
if(webClient->client().write(pixel, i) != i) {
|
||||||
Log.warning(F("GUI: Pixelbuffer not completely sent"));
|
Log.warning(F("GUI: Pixelbuffer not completely sent"));
|
||||||
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
|
lv_disp_flush_ready(disp); // tell lvgl that flushing is done
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,10 +252,10 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tft.endWrite(); /* terminate TFT transaction */
|
tft.endWrite(); // terminate TFT transaction
|
||||||
|
|
||||||
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
|
lv_disp_flush_ready(disp); // tell lvgl that flushing is done
|
||||||
}
|
} */
|
||||||
|
|
||||||
/* Interrupt driven periodic handler */
|
/* Interrupt driven periodic handler */
|
||||||
static void IRAM_ATTR lv_tick_handler(void)
|
static void IRAM_ATTR lv_tick_handler(void)
|
||||||
@ -199,7 +284,7 @@ void guiFirstCalibration()
|
|||||||
// haspFirstSetup();
|
// haspFirstSetup();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
bool IRAM_ATTR my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
||||||
{
|
{
|
||||||
#ifdef TOUCH_CS
|
#ifdef TOUCH_CS
|
||||||
uint16_t touchX, touchY;
|
uint16_t touchX, touchY;
|
||||||
@ -212,7 +297,7 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
guiCheckSleep();
|
if(guiSleeping > 0) guiCheckSleep(); // update Idle
|
||||||
|
|
||||||
// Ignore first press?
|
// Ignore first press?
|
||||||
|
|
||||||
@ -226,12 +311,10 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
|||||||
data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
||||||
data->point.x = touchX;
|
data->point.x = touchX;
|
||||||
data->point.y = touchY;
|
data->point.y = touchY;
|
||||||
/*
|
/* Serial.print("Data x");
|
||||||
Serial.print("Data x");
|
Serial.println(touchX);
|
||||||
Serial.println(touchX);
|
Serial.print("Data y");
|
||||||
|
Serial.println(touchY);*/
|
||||||
Serial.print("Data y");
|
|
||||||
Serial.println(touchY);*/
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user