|
23 | 23 | File pFileOut; |
24 | 24 | #endif |
25 | 25 |
|
| 26 | +#if defined(POSIX) && USE_MONITOR |
| 27 | +bool gui_pop_screenshot_request(void); |
| 28 | +#endif |
| 29 | + |
26 | 30 | #if ESP32 |
27 | 31 | static SemaphoreHandle_t xGuiSemaphore = NULL; |
28 | 32 | static TaskHandle_t g_lvgl_task_handle; |
@@ -388,6 +392,12 @@ IRAM_ATTR void guiLoop(void) |
388 | 392 | #if HASP_TARGET_ARDUINO |
389 | 393 | // haspTouch.loop(); |
390 | 394 | #endif |
| 395 | + |
| 396 | +#if defined(POSIX) && USE_MONITOR |
| 397 | + if(gui_pop_screenshot_request()) { |
| 398 | + guiTakeScreenshot("screenshot.bmp"); |
| 399 | + } |
| 400 | +#endif |
391 | 401 | } |
392 | 402 |
|
393 | 403 | void guiEverySecond(void) |
@@ -618,7 +628,7 @@ bool guiSetConfig(const JsonObject& settings) |
618 | 628 | #endif // HASP_USE_CONFIG |
619 | 629 |
|
620 | 630 | /* **************************** SCREENSHOTS ************************************** */ |
621 | | -#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 || HASP_USE_HTTP > 0 |
| 631 | +#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 || HASP_USE_HTTP > 0 || defined(POSIX) |
622 | 632 |
|
623 | 633 | /** Send Bitmap Header. |
624 | 634 | * |
@@ -666,7 +676,7 @@ void gui_flush_not_complete() |
666 | 676 | { |
667 | 677 | LOG_WARNING(TAG_GUI, F("Pixelbuffer not completely sent")); |
668 | 678 | } |
669 | | -#endif // HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 || HASP_USE_HTTP > 0 |
| 679 | +#endif // HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 || HASP_USE_HTTP > 0 || defined(POSIX) |
670 | 680 |
|
671 | 681 | #if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 |
672 | 682 | /* Flush VDB bytes to a file */ |
@@ -722,6 +732,56 @@ void guiTakeScreenshot(const char* pFileName) |
722 | 732 | LOG_WARNING(TAG_GUI, F(D_FILE_SAVE_FAILED), pFileName); |
723 | 733 | } |
724 | 734 | } |
| 735 | +#elif defined(POSIX) |
| 736 | +static FILE* pFileOutPosix = NULL; |
| 737 | + |
| 738 | +static void gui_screenshot_to_file(lv_disp_drv_t* disp, const lv_area_t* area, lv_color_t* color_p) |
| 739 | +{ |
| 740 | + size_t len = (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1); |
| 741 | + len *= sizeof(lv_color_t); |
| 742 | + size_t res = fwrite((uint8_t*)color_p, 1, len, pFileOutPosix); |
| 743 | + if(res != len) gui_flush_not_complete(); |
| 744 | + |
| 745 | + drv_display_flush_cb(disp, area, color_p); |
| 746 | +} |
| 747 | + |
| 748 | +void guiTakeScreenshot(const char* pFileName) |
| 749 | +{ |
| 750 | + uint8_t buffer[sizeof(bmp_header_t) + 2]; |
| 751 | + gui_get_bitmap_header(buffer, sizeof(buffer)); |
| 752 | + |
| 753 | + pFileOutPosix = fopen(pFileName, "wb"); |
| 754 | + if(pFileOutPosix) { |
| 755 | + |
| 756 | + size_t len = fwrite(buffer, 1, sizeof(buffer), pFileOutPosix); |
| 757 | + if(len == sizeof(buffer)) { |
| 758 | + LOG_VERBOSE(TAG_GUI, F("Bitmap header written")); |
| 759 | + |
| 760 | + lv_disp_t* disp = lv_disp_get_default(); |
| 761 | + drv_display_flush_cb = disp->driver.flush_cb; |
| 762 | + disp->driver.flush_cb = gui_screenshot_to_file; |
| 763 | + |
| 764 | + lv_obj_invalidate(lv_scr_act()); |
| 765 | + lv_refr_now(NULL); |
| 766 | + disp->driver.flush_cb = drv_display_flush_cb; |
| 767 | + |
| 768 | + char fullpath[PATH_MAX]; |
| 769 | + if(realpath(pFileName, fullpath)) { |
| 770 | + LOG_VERBOSE(TAG_GUI, F("Bitmap data flushed to %s"), fullpath); |
| 771 | + } else { |
| 772 | + LOG_VERBOSE(TAG_GUI, F("Bitmap data flushed to %s"), pFileName); |
| 773 | + } |
| 774 | + |
| 775 | + } else { |
| 776 | + LOG_ERROR(TAG_GUI, F("Data written does not match header size")); |
| 777 | + } |
| 778 | + fclose(pFileOutPosix); |
| 779 | + pFileOutPosix = NULL; |
| 780 | + |
| 781 | + } else { |
| 782 | + LOG_WARNING(TAG_GUI, F(D_FILE_SAVE_FAILED), pFileName); |
| 783 | + } |
| 784 | +} |
725 | 785 | #endif |
726 | 786 |
|
727 | 787 | #if HASP_USE_HTTP > 0 |
|
0 commit comments