Skip to content

Commit

Permalink
Use TJPGD in flash (stack in PSRAM?) - release
Browse files Browse the repository at this point in the history
  • Loading branch information
philippe44 committed Sep 15, 2022
1 parent 1804b8b commit eb86ffd
Show file tree
Hide file tree
Showing 8 changed files with 1,119 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -98,5 +98,6 @@ test/.vscode/

node_modules/*
esp-dsp/
*.bak


15 changes: 10 additions & 5 deletions 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 )
2 changes: 1 addition & 1 deletion components/display/SH1106.c
Expand Up @@ -87,7 +87,7 @@ static void SetContrast( struct GDS_Device* Device, uint8_t Contrast ) {
Device->WriteCommand( Device, Contrast );
}

static void SPIParams(int Speed, uint8_t *mode, uint16_t *CS_pre, uint8_t *CS_post) {
static void SPIParams(int Speed, uint8_t *mode, uint8_t *CS_pre, uint8_t *CS_post) {
*CS_post = Speed / (8*1000*1000);
}

Expand Down
20 changes: 5 additions & 15 deletions components/display/core/gds_image.c
Expand Up @@ -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"
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -421,21 +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
ESP_LOGW(TAG,"Context before p:%d, w:%d, h:%d, min(%d,%d), ofs(%d,%d)",
Context.Pixels,
Context.Width, Context.Height,
Context.XMin, Context.YMin,
Context.XOfs, Context.YOfs);
Res = jd_decomp(&Decoder, OutHandlerDirect, N);
ESP_LOGW(TAG,"Context after p:%d, w:%d, h:%d, min(%d,%d), ofs(%d,%d)",
Context.Pixels,
Context.Width, Context.Height,
Context.XMin, Context.YMin,
Context.XOfs, Context.YOfs);
if (Res == JDR_OK && Context.Pixels == Context.Width * Context.Height) {
if (Res == JDR_OK) {
Device->Dirty = true;
Ret = true;
} else {
Expand Down
42 changes: 32 additions & 10 deletions components/squeezelite/displayer.c
Expand Up @@ -177,6 +177,9 @@ static struct {
u32_t size;
u16_t x, y;
bool enable, full;
#ifdef TJPGD_ROM
bool ready;
#endif
} artwork;

#define MAX_BARS 32
Expand Down Expand Up @@ -848,7 +851,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;
Expand All @@ -866,25 +869,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);
}

/****************************************************************************************
Expand Down Expand Up @@ -1304,7 +1316,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);

Expand Down
3 changes: 3 additions & 0 deletions components/tjpgd/CMakeLists.txt
@@ -0,0 +1,3 @@
idf_component_register( SRC_DIRS .
INCLUDE_DIRS .
)

0 comments on commit eb86ffd

Please sign in to comment.