adding inverted color commands

This commit is contained in:
aeroreyna
2026-01-09 10:48:27 -05:00
parent 1ce6e1adab
commit 7d3ae06e63
4 changed files with 195 additions and 9 deletions
+101 -8
View File
@@ -1,6 +1,12 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "pico/util/queue.h"
@@ -47,11 +53,44 @@ int epaper_init()
return 1;
}
void draw_sine_wave_line(int x_start, int y_center, int length, int amplitude, float cycles)
{
if (length == 0) {
return;
}
int step_count = abs(length);
if (step_count < 40) {
step_count = 40;
} else if (step_count > 400) {
step_count = 400;
}
double prev_x = x_start;
double prev_y = y_center;
for (int i = 1; i <= step_count; ++i) {
double t = (double)i / step_count;
double angle = 2.0 * M_PI * cycles * t;
double next_x = x_start + length * t;
double next_y = y_center + amplitude * sin(angle);
Paint_DrawLine((int)round(prev_x), (int)round(prev_y),
(int)round(next_x), (int)round(next_y),
BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
prev_x = next_x;
prev_y = next_y;
}
}
bool editor_mode = false;
uint32_t editor_last_ts = 0;
char screen_log[2000];
int screen_log_i = 0;
sFONT *current_font = &Font16;
UBYTE editor_bg_color = WHITE;
UBYTE editor_fg_color = BLACK;
int epaper_close()
{
@@ -89,6 +128,15 @@ void process_command(char *cmd)
Paint_DrawString_CN(10, 110, "微雪电子", &Font24CN, BLACK, WHITE);
EPD_4IN2_V2_Display(BlackImage);
printf("Draw test complete\n");
} else if (screen_on && strncmp(cmd, "draw_text_white", 15) == 0) {
int x, y;
char text[200];
if (sscanf(cmd, "draw_text_white %d %d %199[^\n]", &x, &y, text) == 3) {
Paint_DrawString_EN(x, y, text, current_font, BLACK, WHITE);
printf("Drew white text at %d, %d: %s\n", x, y, text);
} else {
printf("Invalid draw_text_white command format. Use: draw_text_white x y text\n");
}
} else if (screen_on && strncmp(cmd, "draw_text", 9) == 0) {
int x, y;
char text[200];
@@ -114,7 +162,16 @@ void process_command(char *cmd)
} else {
printf("Invalid draw_line command format. Use: draw_line x1 y1 x2 y2\n");
}
} else if (screen_on && strncmp(cmd, "draw_rectangle", 14) == 0) {
} else if (screen_on && strncmp(cmd, "draw_sine", 9) == 0) {
int x, y, length, amplitude;
float frequency;
if (sscanf(cmd, "draw_sine %d %d %d %d %f", &x, &y, &length, &amplitude, &frequency) == 5) {
draw_sine_wave_line(x, y, length, amplitude, frequency);
printf("Drew sine wave starting at %d,%d length %d amplitude %d frequency %.2f\n", x, y, length, amplitude, frequency);
} else {
printf("Invalid draw_sine command format. Use: draw_sine x y length amplitude frequency\n");
}
} else if (screen_on && strncmp(cmd, "draw_rectangle", 14) == 0 && (cmd[14] == ' ' || cmd[14] == '\0')) {
int x1, y1, x2, y2;
if (sscanf(cmd, "draw_rectangle %d %d %d %d", &x1, &y1, &x2, &y2) == 4) {
Paint_DrawRectangle(x1, y1, x2, y2, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
@@ -122,7 +179,15 @@ void process_command(char *cmd)
} else {
printf("Invalid draw_rectangle command format. Use: draw_rectangle x1 y1 x2 y2\n");
}
} else if (screen_on && strncmp(cmd, "draw_circle", 11) == 0) {
} else if (screen_on && strncmp(cmd, "draw_rectangle_fill", 18) == 0) {
int x1, y1, x2, y2;
if (sscanf(cmd, "draw_rectangle_fill %d %d %d %d", &x1, &y1, &x2, &y2) == 4) {
Paint_DrawRectangle(x1, y1, x2, y2, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
printf("Drew filled rectangle from %d,%d to %d,%d\n", x1, y1, x2, y2);
} else {
printf("Invalid draw_rectangle_fill command format. Use: draw_rectangle_fill x1 y1 x2 y2\n");
}
} else if (screen_on && strncmp(cmd, "draw_circle", 11) == 0 && (cmd[11] == ' ' || cmd[11] == '\0')) {
int x, y, r;
if (sscanf(cmd, "draw_circle %d %d %d", &x, &y, &r) == 3) {
Paint_DrawCircle(x, y, r, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
@@ -130,6 +195,14 @@ void process_command(char *cmd)
} else {
printf("Invalid draw_circle command format. Use: draw_circle x y r\n");
}
} else if (screen_on && strncmp(cmd, "draw_circle_fill", 16) == 0) {
int x, y, r;
if (sscanf(cmd, "draw_circle_fill %d %d %d", &x, &y, &r) == 3) {
Paint_DrawCircle(x, y, r, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
printf("Drew filled circle at %d,%d with radius %d\n", x, y, r);
} else {
printf("Invalid draw_circle_fill command format. Use: draw_circle_fill x y r\n");
}
} else if (screen_on && strncmp(cmd, "draw_num", 8) == 0) {
int x, y, num;
if (sscanf(cmd, "draw_num %d %d %d", &x, &y, &num) == 3) {
@@ -149,11 +222,29 @@ void process_command(char *cmd)
} else if (screen_on && strcmp(cmd, "close") == 0) {
epaper_close();
printf("e-Paper closed\n");
} else if (screen_on && strcmp(cmd, "editor") == 0) {
} else if (screen_on && strncmp(cmd, "editor", 6) == 0 && (cmd[6] == '\0' || cmd[6] == ' ')) {
int invert_flag = 0;
if (cmd[6] == ' ') {
if (sscanf(cmd, "editor %d", &invert_flag) != 1) {
printf("Invalid editor command format. Use: editor [0|1]\n");
return;
}
}
if (invert_flag != 0) {
editor_bg_color = BLACK;
editor_fg_color = WHITE;
} else {
editor_bg_color = WHITE;
editor_fg_color = BLACK;
}
if (!editor_mode) {
screen_log_i = 0;
screen_log[0] = '\0';
}
editor_mode = true;
absolute_time_t time = get_absolute_time();
editor_last_ts = to_ms_since_boot(time);
printf("Editor mode enabled\n");
printf("Editor mode enabled (%s background)\n", invert_flag != 0 ? "black" : "white");
} else {
printf("Unknown command: %s\n", cmd);
}
@@ -216,9 +307,9 @@ void core1_entry() {
screen_last_ts = to_ms_since_boot(time);
if(editor_mode){
bool overflow = false;
Paint_Clear(WHITE);
Paint_Clear(editor_bg_color);
screen_log[screen_log_i] = '\0';
overflow = Paint_DrawString_EN(10, 10, screen_log, current_font, WHITE, BLACK);
overflow = Paint_DrawString_EN(10, 10, screen_log, current_font, editor_bg_color, editor_fg_color);
if(overflow){
while(screen_log[screen_log_i] != '\n' || screen_log_i>1){
screen_log_i--;
@@ -230,9 +321,9 @@ void core1_entry() {
}
screen_log_i = new_i;
}
Paint_Clear(WHITE);
Paint_Clear(editor_bg_color);
// if overflow reset the screen_log buffer with only the last line
Paint_DrawString_EN(10, 10, screen_log, current_font, WHITE, BLACK);
Paint_DrawString_EN(10, 10, screen_log, current_font, editor_bg_color, editor_fg_color);
}
EPD_4IN2_V2_PartialDisplay(BlackImage, 0, 0, 400, 300);
} else {
@@ -285,6 +376,8 @@ int main()
if(editor_last_ts != 0 && editor_mode && (editor_last_ts + 10000 < ms)){
printf("Disabling editor after 10s of inactivity");
editor_mode = false;
editor_bg_color = WHITE;
editor_fg_color = BLACK;
}
}