libwebsockets/minimal-examples/embedded/lhp/lhp-ss.c
Andy Green 31ff36e09d minimal: embedded lhp examples
Implements a carousel rendering and displaying remote HTML + JPEG + PNGs
on a variety of display devices, including several EPDs.
2022-05-04 08:43:26 +01:00

131 lines
2.9 KiB
C

/*
* devices for Waveshare ESP32 driver board
*
* Written in 2010-2022 by Andy Green <andy@warmcat.com>
*
* This file is made available under the Creative Commons CC0 1.0
* Universal Public Domain Dedication.
*/
#define LWIP_PROVIDE_ERRNO 1
#define _ESP_PLATFORM_ERRNO_H_
#include "main.h"
static void
render(lws_sorted_usec_list_t *sul)
{
lws_display_render_state_t *rs = lws_container_of(sul,
lws_display_render_state_t, sul);
lws_stateful_ret_t r;
lws_box_t box;
int budget = 10;
lws_fx_set(box.x, 0, 0);
lws_fx_set(box.y, 0, 0);
if (!rs->line) {
/*
* We must finalize the ids list with the accurate dlo box info
* before starting the render, since some EPD need to keep
* copies of the pixel data for that region in order to over-
* write it later.
*/
lws_display_get_ids_boxes(rs);
rs->sp = 0;
rs->st[0].dlo = NULL;
/* allocate one line of output pixels to render into */
rs->line = malloc((size_t)rs->ic->wh_px[0].whole * (rs->ic->greyscale ? 1 : 3));
if (!rs->line) {
lwsl_err("%s: OOM\n", __func__);
/* !!! cleanup */
return;
}
rs->curr = 0;
/*
* Initialize the blitter with the dimensions of the data we
* will send.
*/
box.w = rs->ic->wh_px[0];
box.h = rs->ic->wh_px[1];
rs->lds->disp->blit(rs->lds, (uint8_t *)rs, &box, &rs->ids);
show_demo_phase(LWS_LHPCD_PHASE_RENDERING);
#if defined(LWS_WITH_ALLOC_METADATA_LWS)
_lws_alloc_metadata_dump_lws(lws_alloc_metadata_dump_stdout, NULL);
#endif
}
/* single-line blits are line data */
box.w = rs->ic->wh_px[0];
box.h.whole = 1;
while (rs->curr != rs->lowest_id_y) {
if (!budget--) {
lws_sul_schedule(rs->lds->ctx, 0, &rs->sul, render, 1);
return;
}
r = lws_display_list_render_line(rs);
if (r & LWS_SRET_YIELD)
lws_sul_schedule(rs->lds->ctx, 0, &rs->sul, render, 1);
if (r) {
if (r & LWS_SRET_WANT_INPUT) {
lws_sul_schedule(rs->lds->ctx, 0, &rs->sul, render, LWS_US_PER_MS);
return;
}
}
box.y.whole = rs->curr;
/* rs->line is a line of Y or RGB pixels, the blitter will
* convert to the panel's packed format and deal with diffusion
*/
rs->lds->disp->blit(rs->lds, (uint8_t *)rs->line, &box, &rs->ids);
rs->curr++;
}
lws_sul_cancel(sul);
lwsl_notice("%s: zero-height blit for end\n", __func__);
/* zero-height blit indicates update finished */
box.h.whole = 0;
rs->lds->disp->blit(rs->lds, (uint8_t *)rs->line, &box, &rs->ids);
free(rs->line);
rs->line = NULL;
lws_display_list_destroy(&rs->displaylist);
show_demo_phase(LWS_LHPCD_PHASE_IDLE);
}
int
init_browse(struct lws_context *cx, lws_display_render_state_t *rs,
const char *url)
{
show_demo_phase(LWS_LHPCD_PHASE_FETCHING);
lws_display_dl_init(&rs->displaylist, &lds);
rs->ic = &lds.disp->ic;
rs->lds = &lds;
rs->lds->display_busy = 1;
lws_strncpy(rs->lds->current_url, url, sizeof(rs->lds->current_url));
return lws_lhp_ss_browse(cx, rs, url, render);
}