Add screenshot

This commit is contained in:
fvanroie 2020-02-02 23:37:04 +01:00
parent b99c7a0a2f
commit 9de0220e11
3 changed files with 87 additions and 17 deletions

View File

@ -27,17 +27,17 @@
#define LVGL_TICK_PERIOD 30 // 30 #define LVGL_TICK_PERIOD 30 // 30
bool guiAutoCalibrate = true;
uint16_t guiSleepTime = 150; // 0.1 second resolution uint16_t guiSleepTime = 150; // 0.1 second resolution
bool guiSleeping = false; bool guiSleeping = false;
uint8_t guiTickPeriod = 50; uint8_t guiTickPeriod = 50;
Ticker tick; /* timer for interrupt handler */ static Ticker tick; /* timer for interrupt handler */
TFT_eSPI tft = TFT_eSPI(); /* TFT instance */ static TFT_eSPI tft = TFT_eSPI(); /* TFT instance */
uint16_t calData[5] = {0, 65535, 0, 65535, 0}; static uint16_t calData[5] = {0, 65535, 0, 65535, 0};
bool guiAutoCalibrate = true;
static WiFiClient webClient; // for snatshot
static File pFileOut; static File pFileOut;
static bool bSnapshot; static uint8_t guiSnapshot = 0;
static uint32_t DISP_IMPL_lvgl_formatPixel(lv_color_t color);
bool IRAM_ATTR guiCheckSleep() bool IRAM_ATTR guiCheckSleep()
{ {
@ -67,26 +67,53 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
{ {
uint16_t c; uint16_t c;
if(bSnapshot == true) { if(guiSnapshot != 0) {
// uint32_t data; int i = 0;
uint8_t pixel[4]; uint8_t pixel[1024];
pixel[3] = 0xFF;
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);
pixel[0] = (LV_COLOR_GET_B(*color_p) * 263 + 7) >> 5; pixel[i++] = (LV_COLOR_GET_B(*color_p) * 263 + 7) >> 5;
pixel[1] = (LV_COLOR_GET_G(*color_p) * 259 + 3) >> 6; pixel[i++] = (LV_COLOR_GET_G(*color_p) * 259 + 3) >> 6;
pixel[2] = (LV_COLOR_GET_R(*color_p) * 263 + 7) >> 5; pixel[i++] = (LV_COLOR_GET_R(*color_p) * 263 + 7) >> 5;
pixel[3] = 0xFF; pixel[i++] = 0xFF;
pFileOut.write(pixel, sizeof(pixel));
color_p++; color_p++;
// i += 4;
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.write(pixel, i) != i) {
errorPrintln(F("GUI: %sPixelbuffer not completely sent"));
}
}
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.write(pixel, i) != i) {
errorPrintln(F("GUI: %sPixelbuffer not completely sent"));
}
}
}
} else { } else {
tft.startWrite(); /* Start new TFT transaction */ tft.startWrite(); /* Start new TFT transaction */
@ -101,6 +128,7 @@ 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 */
} }
@ -394,11 +422,34 @@ void guiTakeScreenshot(const char * pFileName)
return; return;
} }
bSnapshot = true; guiSnapshot = 1;
lv_obj_invalidate(lv_scr_act()); lv_obj_invalidate(lv_scr_act());
lv_refr_now(NULL); /* Will call our disp_drv.disp_flush function */ lv_refr_now(NULL); /* Will call our disp_drv.disp_flush function */
bSnapshot = false; guiSnapshot = 0;
pFileOut.close(); pFileOut.close();
printf(("[Display] data flushed to %s", pFileName)); printf(("[Display] data flushed to %s", pFileName));
} }
void guiTakeScreenshot(WiFiClient client)
{
webClient = client;
uint8_t bmpheader[138] = {0x42, 0x4D, 0x8A, 0xB0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C,
0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x20, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x42, 0x47, 0x52, 0x73};
if(client.write(bmpheader, sizeof(bmpheader)) != sizeof(bmpheader)) {
Serial.println("Data sent does not match header size!");
} else {
Serial.println("OK BMP Header sent!");
}
guiSnapshot = 2;
lv_obj_invalidate(lv_scr_act());
lv_refr_now(NULL); /* Will call our disp_drv.disp_flush function */
guiSnapshot = 0;
printf("[Display] data flushed to webclient");
}

View File

@ -6,12 +6,19 @@
#include "lvgl.h" #include "lvgl.h"
#if defined(ARDUINO_ARCH_ESP32)
#include <Wifi.h>
#else
#include <ESP8266WiFi.h>
#endif
void guiSetup(TFT_eSPI & screen, JsonObject settings); void guiSetup(TFT_eSPI & screen, JsonObject settings);
void guiLoop(void); void guiLoop(void);
void guiStop(void); void guiStop(void);
void guiCalibrate(); void guiCalibrate();
void guiTakeScreenshot(const char * pFileName); void guiTakeScreenshot(const char * pFileName);
void guiTakeScreenshot(WiFiClient client);
bool guiGetConfig(const JsonObject & settings); bool guiGetConfig(const JsonObject & settings);
bool guiSetConfig(const JsonObject & settings); bool guiSetConfig(const JsonObject & settings);

View File

@ -255,6 +255,17 @@ void httpHandleReboot()
dispatchCommand(F("reboot")); dispatchCommand(F("reboot"));
} }
////////////////////////////////////////////////////////////////////////////////////////////////////
void webHandleScreenshot()
{ // http://plate01/about
if(!httpIsAuthenticated(F("/screenshot"))) return;
webServer.setContentLength(138 + 320 * 240 * 4);
webServer.send(200, PSTR("image/bmp"), "");
guiTakeScreenshot(webServer.client());
}
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
void webHandleAbout() void webHandleAbout()
{ // http://plate01/about { // http://plate01/about
@ -1084,6 +1095,7 @@ void httpSetup(const JsonObject & settings)
#if LV_USE_HASP_WIFI > 0 #if LV_USE_HASP_WIFI > 0
webServer.on(F("/config/wifi"), webHandleWifiConfig); webServer.on(F("/config/wifi"), webHandleWifiConfig);
#endif #endif
webServer.on(F("/screenshot"), webHandleScreenshot);
webServer.on(F("/saveConfig"), webHandleSaveConfig); webServer.on(F("/saveConfig"), webHandleSaveConfig);
webServer.on(F("/resetConfig"), httpHandleResetConfig); webServer.on(F("/resetConfig"), httpHandleResetConfig);
webServer.on(F("/firmware"), webHandleFirmware); webServer.on(F("/firmware"), webHandleFirmware);