Files
lilygo-t5-template/lib/epdiy/examples/screen_diag/main/commands/tests.c
Кобелев Андрей Андреевич a111352dc5 Прошло 2 года.
2026-03-10 22:54:23 +03:00

139 lines
4.1 KiB
C

#include "tests.h"
#include <stdio.h>
#include <argtable3/argtable3.h>
#include <esp_console.h>
#include "../commands.h"
#include "../epd.h"
#include "fonts.h"
static struct {
struct arg_int* slope;
struct arg_int* width;
struct arg_int* color;
struct arg_end* end;
} render_stairs_args;
static struct {
struct arg_int* gutter;
struct arg_int* color;
struct arg_end* end;
} render_grid_args;
static int render_stairs_cmd(int argc, char* argv[]);
static int render_grid_cmd(int argc, char* argv[]);
void register_tests_commands(void) {
// setup args
render_stairs_args.slope = arg_intn(
NULL, NULL, "<slope>", 0, 1, "angle by which each diagonal line is drawn. default value: 3"
);
render_stairs_args.width = arg_intn(
NULL, NULL, "<width>", 0, 1, "thickness of each diagonal line. default value: 100"
);
render_stairs_args.color = arg_intn(NULL, NULL, "<color>", 0, 1, "default value: 0x00");
render_stairs_args.end = arg_end(NARGS(render_stairs_args));
render_grid_args.gutter
= arg_intn(NULL, NULL, "<gutter>", 0, 1, "default value: 75"); // gcd(1200, 825) = 75
render_grid_args.color = arg_intn(NULL, NULL, "<color>", 0, 1, "default value: 0x00");
render_grid_args.end = arg_end(NARGS(render_grid_args));
// register commands
const esp_console_cmd_t commands[] = {
{ .command = "render_stairs",
.help = "Render multiple diagonal lines across the screen.",
.hint = NULL,
.func = &render_stairs_cmd,
.argtable = &render_stairs_args },
{ .command = "render_grid",
.help
= "Renders a grid across the whole screen. At a certain gutter size, cell info will "
"be printed as well.",
.hint = NULL,
.func = &render_grid_cmd,
.argtable = &render_grid_args },
};
for (size_t i = 0; i < ARRAY_SIZE(commands); ++i)
ESP_ERROR_CHECK(esp_console_cmd_register(&commands[i]));
}
static void render_stairs(int slope, int width, uint8_t color) {
for (int y = 0, x = 0; y < epd_rotated_display_height(); y++) {
epd_draw_hline(x, y, width, color, g_framebuffer);
x += slope;
if (x + width > epd_rotated_display_width())
x = 0;
}
}
static int render_stairs_cmd(int argc, char* argv[]) {
HANDLE_ARGUMENTS(render_stairs_args)
uint8_t color = 0x00;
if (!validate_color(&color, render_stairs_args.color))
return 1;
const int slope = GET_INT_ARG(render_stairs_args.slope, 3);
const int width = GET_INT_ARG(render_stairs_args.width, 100);
if (slope < 1 || slope > width) {
printf("Slope %d is too steep: Must be between 1 and width (%d)\r\n", slope, width);
return 1;
}
render_stairs(slope, width, color);
update_screen();
return 0;
}
void render_grid(int gutter, uint8_t color) {
const int width = epd_rotated_display_width();
const int height = epd_rotated_display_height();
// draw lines
for (int row = gutter; row < height; row += gutter)
epd_draw_hline(0, row, width, color, g_framebuffer);
for (int col = gutter; col < width; col += gutter)
epd_draw_vline(col, 0, height, color, g_framebuffer);
// skip printing info if it wouldn't fit
if (gutter < Alexandria.advance_y * 2)
return;
// prepare info
static char label[32];
int col = 0, row;
for (int y = 0; y < height; y += gutter, ++col) {
row = 0;
for (int x = 0; x < width; x += gutter, ++row) {
// print info
snprintf(label, sizeof(label), "(%d,%d)", row, col);
int rx = y + Alexandria.advance_y;
int cx = x + 4; // margin
epd_write_default(&Alexandria, label, &cx, &rx, g_framebuffer);
}
}
}
static int render_grid_cmd(int argc, char* argv[]) {
HANDLE_ARGUMENTS(render_grid_args)
uint8_t color = 0x00;
if (!validate_color(&color, render_grid_args.color))
return 1;
const int gutter = GET_INT_ARG(render_grid_args.gutter, 75);
render_grid(gutter, color);
update_screen();
return 0;
}