fix(voice): preview generated png and recover shared spi display/print

This commit is contained in:
admin
2026-02-28 15:49:49 +08:00
parent 47a4aed0c4
commit c91889490a
10 changed files with 350 additions and 61 deletions

View File

@@ -182,6 +182,11 @@ esp_err_t screen_preview_show_raster(const uint8_t *raster,
uint32_t timeout_ms,
char *err,
size_t err_len);
esp_err_t screen_preview_show_png(const uint8_t *png,
size_t png_len,
uint32_t timeout_ms,
char *err,
size_t err_len);
// ---------- printer_protocol ----------
typedef enum {

View File

@@ -11,3 +11,12 @@ esp_err_t screen_preview_show_raster(const uint8_t *raster,
{
return platform_display_show_raster_1bpp(raster, raster_len, width, height, timeout_ms, err, err_len);
}
esp_err_t screen_preview_show_png(const uint8_t *png,
size_t png_len,
uint32_t timeout_ms,
char *err,
size_t err_len)
{
return platform_display_show_png(png, png_len, timeout_ms, err, err_len);
}

View File

@@ -17,8 +17,9 @@ static const char *TAG = "voice_interaction";
#define VOICE_IMAGE_MARKER_REPEAT_SUPPRESS_MS 45000
#define VOICE_IMAGE_PRINT_THRESHOLD 160
#define VOICE_IMAGE_PRINT_MAX_HEIGHT 2200
#define VOICE_IMAGE_PREVIEW_TIMEOUT_MS 200
#define VOICE_IMAGE_MARKER_TEMPLATE \
"%s黑白线稿风格,白色背景,主体居中,边缘清晰,细节简洁,高对比,避免大面积阴影和灰度渐变,适配热敏打印机打印。"
"%s线稿风格白色背景边缘清晰细节简洁高对比避免大面积阴影和灰度渐变适配热敏打印机打印。"
#define VOICE_IMAGE_MARKER_TEMPLATE_FALLBACK_SUBJECT "简洁卡通图案"
typedef struct {
@@ -228,6 +229,38 @@ static void voice_build_marker_image_prompt(const char *subject,
}
}
static void voice_try_preview_marker_png(const voice_image_generation_task_arg_t *task_arg,
const uint8_t *png,
size_t png_len) {
if (task_arg == NULL || png == NULL || png_len == 0) {
return;
}
char preview_err[96] = {0};
esp_err_t preview_rc = screen_preview_show_png(png,
png_len,
VOICE_IMAGE_PREVIEW_TIMEOUT_MS,
preview_err,
sizeof(preview_err));
if (preview_rc == ESP_OK) {
ESP_LOGI(TAG,
"[stage] marker_image_preview_ok: dialog_id=%s png_bytes=%u",
task_arg->dialog_id[0] != '\0' ? task_arg->dialog_id : "-",
(unsigned)png_len);
return;
}
if (preview_rc == ESP_ERR_NOT_SUPPORTED) {
return;
}
ESP_LOGW(TAG,
"[stage] marker_image_preview_failed: dialog_id=%s rc=0x%x msg=%s",
task_arg->dialog_id[0] != '\0' ? task_arg->dialog_id : "-",
(unsigned)preview_rc,
preview_err[0] != '\0' ? preview_err : "preview failed");
}
static esp_err_t voice_submit_marker_generated_image(const voice_image_generation_task_arg_t *task_arg,
const image_generation_result_t *result,
char *err,
@@ -237,6 +270,8 @@ static esp_err_t voice_submit_marker_generated_image(const voice_image_generatio
return ESP_ERR_INVALID_ARG;
}
voice_try_preview_marker_png(task_arg, result->png, result->png_len);
uint16_t raster_width = 0;
uint16_t raster_height = 0;
uint8_t *raster = NULL;
@@ -280,14 +315,18 @@ static esp_err_t voice_submit_marker_generated_image(const voice_image_generatio
uint32_t job_id = 0;
char submit_err[128] = {0};
esp_err_t submit_rc = printer_protocol_submit_raster_job(raster,
raster_len,
raster_width,
raster_height,
NULL,
&job_id,
submit_err,
sizeof(submit_err));
printer_print_options_t print_opt = {
.direct_ignore_precheck = true,
};
esp_err_t submit_rc = printer_protocol_submit_raster_job_ex(raster,
raster_len,
raster_width,
raster_height,
NULL,
&print_opt,
&job_id,
submit_err,
sizeof(submit_err));
if (submit_rc != ESP_OK) {
voice_fill_err(err,
err_len,
@@ -371,7 +410,6 @@ static void voice_image_generation_task(void *arg) {
gen_err[0] != '\0' ? gen_err : "image generation failed");
}
printer_protocol_status_poll_pause_release(&status_poll_pause_token);
image_generation_result_free(&result);
voice_marker_image_generation_release();
image_generation_schedule_prewarm();