got it working, just a small bug left

This commit is contained in:
Ellen Arvidsson 2025-06-14 17:17:00 +02:00
parent 4ade3a5f00
commit f3a619decc
7 changed files with 356 additions and 178 deletions

View file

@ -309,47 +309,71 @@ int
osclsk_scope::render_block(void)
{
int res;
size_t render_idx;
static int async_id;
float block_norm;
float block_norm = 1.f;
res = 0;
switch (st) {
case osc_state::SAMPLE_DONE:
block_norm = 1.f;
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN;
render_idx++) {
block_norm = std::max(
std::abs(block_y_max[render_idx]),
block_norm
);
block_norm = std::max(
std::abs(block_y_min[render_idx]),
block_norm
);
}
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN;
render_idx++) {
block_y_max[render_idx] =
block_y_max[render_idx] / block_norm;
block_y_min[render_idx] =
block_y_min[render_idx] / block_norm;
}
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN;
render_idx++) {
screen_px_y_max[render_idx] = 1u + (uint16_t)(
OSCLSK_Y_MAX_PX * (.5f + block_y_max[render_idx])
);
screen_px_y_min[render_idx] = (uint16_t)(
OSCLSK_Y_MAX_PX * (.5f + block_y_min[render_idx])
);
}
if (st != osc_state::SAMPLE_DONE)
return (-1);
tft.async_on_finish(render_finish_tft_cb, this);
st = osc_state::RENDER;
res = tft.async_start();
AC_ASSERT(res >= 0);
if (res < 0)
return (-1);
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN; render_idx++) {
block_norm = std::max( std::abs(block_y_max[render_idx]),
block_norm);
block_norm = std::max( std::abs(block_y_min[render_idx]),
block_norm);
async_id = res;
render_idx = 0;
st = osc_state::RENDER;
__attribute__((fallthrough));
case osc_state::RENDER:
for (; render_idx < OSCLSK_BLOCK_LEN; render_idx++) {
res = tft.async_hline_row_bg_fill(async_id, &bg, &fg,
screen_px_y_min[render_idx],
screen_px_y_max[render_idx],
render_idx);
if (res < 0)
return (-1);
if (res > 0)
return (1);
}
tft.async_end();
break;
default:
break;
}
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN; render_idx++) {
block_y_max[render_idx] = block_y_max[render_idx] / block_norm;
block_y_min[render_idx] = block_y_min[render_idx] / block_norm;
}
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN; render_idx++) {
screen_px_y_max[render_idx] = 1u + (uint16_t)(
OSCLSK_Y_MAX_PX * (.5f + block_y_max[render_idx]));
screen_px_y_min[render_idx] = (uint16_t)(
OSCLSK_Y_MAX_PX * (.5f + block_y_min[render_idx]));
}
res = -1;
tft.async_on_finish(render_finish_tft_cb, this);
tft.async_start();
for (render_idx = 0; render_idx < OSCLSK_BLOCK_LEN; render_idx++) {
res = tft.async_hline_row_bg_fill(&bg, &fg,
screen_px_y_min[render_idx], screen_px_y_max[render_idx],
render_idx);
if (res == -1)
break;
}
tft.async_end();
return (res);
return (0);
}
void