2
0
philippe44 2 жил өмнө
parent
commit
405c7742ef

+ 1 - 15
.gitignore

@@ -1,30 +1,16 @@
-
 build/
-
 .vscode/c_cpp_properties.json
-
 .vscode/launch.json
-
 .vscode/settings.json
-
 .vscode/tasks.json
-
 alltags.txt
-
 components/wifi-manager/network_manager_handlers.multi
-
 esp32.code-workspace
-
 sdkconfig.old
-
 test/.vscode/c_cpp_properties.json
-
 test/.vscode/launch.json
-
 test/.vscode/settings.json
-
 test/.vscode/tasks.json
-
 test/sdkconfig
-
 components/wifi-manager/UML-State-Machine-in-C
+*.bak

+ 10 - 5
components/display/CMakeLists.txt

@@ -1,11 +1,16 @@
+# the JPEG library is in ROM but seems to fail randomly (PSRAM issue?)
+set(TJPGD tjpgd)
+
 idf_component_register(SRC_DIRS . core core/ifaces  fonts
 						INCLUDE_DIRS . fonts core
 						REQUIRES platform_config tools esp_common
-						PRIV_REQUIRES services freertos driver           
-						EMBED_FILES note.jpg
-)
+						PRIV_REQUIRES services freertos driver ${TJPGD}
+						EMBED_FILES note.jpg )		
+
+if (NOT TJPGD)
+add_compile_definitions(TJPGD_ROM)												
+endif()
 
 set_source_files_properties(display.c
     PROPERTIES COMPILE_FLAGS
-   -Wno-format-overflow
-)
+   -Wno-format-overflow )

+ 5 - 5
components/display/core/gds_image.c

@@ -8,7 +8,11 @@
  
 #include <string.h>
 #include "math.h"
+#ifdef TJPGD_ROM
 #include "esp32/rom/tjpgd.h"
+#else
+#include "tjpgd.h"
+#endif
 #include "esp_log.h"
 
 #include "gds.h"
@@ -24,7 +28,6 @@ typedef struct {
     const unsigned char *InData;	// Pointer to jpeg data
     int InPos;						// Current position in jpeg data
 	int Width, Height;	
-	uint32_t Pixels;
 	uint8_t Mode;
 	union {
 		void *OutData;
@@ -144,8 +147,6 @@ static unsigned OutHandlerDirect(JDEC *Decoder, void *Bitmap, JRECT *Frame) {
     uint8_t *Pixels = (uint8_t*) Bitmap;
 	int Shift = 8 - Context->Depth;
 	
-	Context->Pixels += (Frame->bottom - Frame->top + 1) * (Frame->right - Frame->left + 1);						\
-
 	// decoded image is RGB888, shift only make sense for grayscale
 	if (Context->Mode == GDS_RGB888) {
 		OUTHANDLERDIRECT(Scaler888, 0);
@@ -421,11 +422,10 @@ bool GDS_DrawJPEG(struct GDS_Device* Device, uint8_t *Source, int x, int y, int
 		Context.XMin = x - Context.XOfs;
 		Context.YMin = y - Context.YOfs;
 		Context.Mode = Device->Mode;
-		Context.Pixels = 0;
 					
 		// do decompress & draw
 		Res = jd_decomp(&Decoder, OutHandlerDirect, N);
-		if (Res == JDR_OK && Context.Pixels == Context.Width * Context.Height) {
+		if (Res == JDR_OK) {
 			Device->Dirty = true;
 			Ret = true;
 		} else {	

+ 29 - 10
components/squeezelite/displayer.c

@@ -864,7 +864,7 @@ static void grfa_handler(u8_t *data, int len) {
 		} else if (artwork.size) GDS_ClearWindow(display, artwork.x, artwork.y, -1, -1, GDS_COLOR_BLACK);
 		
 		artwork.full = artwork.enable && artwork.x == 0 && artwork.y == 0;
-		LOG_INFO("gfra en:%u x:%hu, y:%hu", artwork.enable, artwork.x, artwork.y);
+		LOG_DEBUG("gfra en:%u x:%hu, y:%hu", artwork.enable, artwork.x, artwork.y);
 		
 		// done in any case
 		return;
@@ -882,25 +882,34 @@ static void grfa_handler(u8_t *data, int len) {
 		artwork.x = htons(pkt->x);
 		artwork.y = htons(pkt->y);
 		artwork.full = artwork.enable && artwork.x == 0 && artwork.y == 0;
+#ifdef TJPGD_ROM
+		xSemaphoreTake(displayer.mutex, portMAX_DELAY);		
+		artwork.ready = false;
+#endif				
 		if (artwork.data) free(artwork.data);
-		artwork.data = malloc(length);
+		artwork.data = malloc(length);		
+#ifdef TJPGD_ROM		
+		xSemaphoreGive(displayer.mutex);
+#endif						
 	}	
 	
 	// copy artwork data
 	memcpy(artwork.data + offset, data + sizeof(struct grfa_packet), size);
 	artwork.size += size;
 	if (artwork.size == length) {
+		xSemaphoreTake(displayer.mutex, portMAX_DELAY);		
+#ifdef TJPGD_ROM
+		artwork.ready = true;		
+#else	
 		GDS_ClearWindow(display, artwork.x, artwork.y, -1, -1, GDS_COLOR_BLACK);
-		xSemaphoreTake(displayer.mutex, portMAX_DELAY);
-		for (int i = 0; i < 2 && !GDS_DrawJPEG(display, artwork.data, artwork.x, artwork.y, artwork.y < displayer.height ? (GDS_IMAGE_RIGHT | GDS_IMAGE_TOP) : GDS_IMAGE_CENTER); i++) {
-			LOG_WARN("JPEG decoding error, pass %d", i+1);
-		}
-		xSemaphoreGive(displayer.mutex);
+		GDS_DrawJPEG(display, artwork.data, artwork.x, artwork.y, artwork.y < displayer.height ? (GDS_IMAGE_RIGHT | GDS_IMAGE_TOP) : GDS_IMAGE_CENTER);
 		free(artwork.data);
 		artwork.data = NULL;
+#endif		
+		xSemaphoreGive(displayer.mutex);
 	} 
-	
-	LOG_INFO("gfra l:%u x:%hu, y:%hu, o:%u s:%u", length, artwork.x, artwork.y, offset, size);
+		
+	LOG_DEBUG("gfra l:%u x:%hu, y:%hu, o:%u s:%u", length, artwork.x, artwork.y, offset, size);
 }
 
 /****************************************************************************************
@@ -1320,7 +1329,17 @@ static void displayer_task(void *args) {
 		// need to make sure we own display
 		if (display && displayer.owned) GDS_Update(display);
 		else if (!led_display) displayer.wake = LONG_WAKE;
-		
+	
+#ifdef TJPGD_ROM	
+		if (artwork.ready) {
+			GDS_ClearWindow(display, artwork.x, artwork.y, -1, -1, GDS_COLOR_BLACK);
+			GDS_DrawJPEG(display, artwork.data, artwork.x, artwork.y, artwork.y < displayer.height ? (GDS_IMAGE_RIGHT | GDS_IMAGE_TOP) : GDS_IMAGE_CENTER);
+			free(artwork.data);
+			artwork.data = NULL;
+			artwork.ready = false;
+		} 
+#endif
+
 		// release semaphore and sleep what's needed
 		xSemaphoreGive(displayer.mutex);