From 4d71b7e11df57e7ccd3061b6ec497036e3b938f9 Mon Sep 17 00:00:00 2001 From: whowechina Date: Fri, 16 Feb 2024 23:29:22 +0900 Subject: [PATCH] Fading and gpio override finally work --- Production/firmware/mai_pico.uf2 | Bin 117248 -> 118784 bytes firmware/src/button.c | 10 +++++++- firmware/src/button.h | 3 ++- firmware/src/cli.c | 2 +- firmware/src/commands.c | 31 ++++++++++++++++++------ firmware/src/io.c | 14 +++++------ firmware/src/rgb.c | 40 ++++++++++++++++--------------- 7 files changed, 64 insertions(+), 36 deletions(-) diff --git a/Production/firmware/mai_pico.uf2 b/Production/firmware/mai_pico.uf2 index 16e737a7ce645a72d4d44c0cc4c276dcf6c1a047..f9396a7e737689e035d8ea3c964f5e6e2ec19a7b 100644 GIT binary patch delta 19194 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 Sc>PaEMl9E3vG(CNV*Ur40zk(A diff --git a/firmware/src/button.c b/firmware/src/button.c index fabd69d..2b51a1d 100644 --- a/firmware/src/button.c +++ b/firmware/src/button.c @@ -47,7 +47,7 @@ uint8_t button_num() return BUTTON_NUM; } -uint8_t button_gpio(int id) +uint8_t button_real_gpio(int id) { if (id >= BUTTON_NUM) { return 0xff; @@ -55,6 +55,14 @@ uint8_t button_gpio(int id) return gpio_real[id]; } +uint8_t button_default_gpio(int id) +{ + if (id >= BUTTON_NUM) { + return 0xff; + } + return gpio_def[id]; +} + static uint16_t button_reading; /* If a switch flips, it freezes for a while */ diff --git a/firmware/src/button.h b/firmware/src/button.h index e0af1af..0e791e1 100644 --- a/firmware/src/button.h +++ b/firmware/src/button.h @@ -14,6 +14,7 @@ void button_init(); uint8_t button_num(); void button_update(); uint16_t button_read(); -uint8_t button_gpio(int id); +uint8_t button_real_gpio(int id); +uint8_t button_default_gpio(int id); #endif diff --git a/firmware/src/cli.c b/firmware/src/cli.c index 9441a9d..0c9792c 100644 --- a/firmware/src/cli.c +++ b/firmware/src/cli.c @@ -11,7 +11,7 @@ #include "save.h" #define MAX_COMMANDS 32 -#define MAX_PARAMETERS 6 +#define MAX_PARAMETERS 10 #define MAX_PARAMETER_LENGTH 20 const char *cli_prompt = "cli>"; diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 38e9941..aa4950d 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -66,10 +66,11 @@ static void disp_gpio() printf("[GPIO]\n"); printf(" Main buttons:"); for (int i = 0; i < 8; i++) { - printf(" %d:%d", i + 1, button_gpio(i)); + printf(" %d:%d", i + 1, button_real_gpio(i)); } printf("\n Test:%d, Service:%d, Navigate:%d, Coin:%d\n", - button_gpio(8), button_gpio(9), button_gpio(10), button_gpio(11)); + button_real_gpio(8), button_real_gpio(9), + button_real_gpio(10), button_real_gpio(11)); } void handle_display(int argc, char *argv[]) @@ -386,9 +387,18 @@ static void handle_save() static void handle_gpio(int argc, char *argv[]) { const char *usage = "Usage: gpio main ... \n" - " or: gpio \n" - " gpio: 0..29\n"; - if (argc == 9) { + " gpio \n" + " gpio reset\n" + " gpio: 0..29\n"; + if (argc == 1) { + if (strcasecmp(argv[0], "reset") != 0) { + printf(usage); + return; + } + for (int i = 0; i < sizeof(mai_cfg->alt.buttons); i++) { + mai_cfg->alt.buttons[i] = 0xff; + } + } else if (argc == 9) { const char *choices[] = {"main"}; if (cli_match_prefix(choices, 1, argv[0]) < 0) { printf(usage); @@ -403,7 +413,11 @@ static void handle_gpio(int argc, char *argv[]) } gpio_main[i] = gpio; } - memcpy(mai_cfg->alt.buttons, gpio_main, 8); + for (int i = 0; i < 8; i++) { + int gpio = gpio_main[i]; + bool is_default = (gpio == button_default_gpio(i)); + mai_cfg->alt.buttons[i] = is_default ? 0xff : gpio; + } } else if (argc == 2) { const char *choices[] = {"test", "service", "navigate", "coin"}; const uint8_t button_pos[] = {8, 9, 10, 11}; @@ -413,13 +427,16 @@ static void handle_gpio(int argc, char *argv[]) printf(usage); return; } - mai_cfg->alt.buttons[button_pos[match]] = gpio; + int index = button_pos[match]; + bool is_default = (gpio == button_default_gpio(index)); + mai_cfg->alt.buttons[index] = is_default ? 0xff : gpio; } else { printf(usage); return; } config_changed(); button_init(); // Re-init the buttons + disp_gpio(); } void commands_init() diff --git a/firmware/src/io.c b/firmware/src/io.c index 510de38..27d8fb6 100644 --- a/firmware/src/io.c +++ b/firmware/src/io.c @@ -126,35 +126,35 @@ static void led_cmd(cdc_t *cdc) switch (cdc->hdr.cmd) { case 0x31: - printf("8b\n"); + //printf("C %d:1: %02x%02x%02x\n", cdc->led.index, cdc->led.r, cdc->led.g, cdc->led.b); rgb_set_button(cdc->led.index, color, 0); break; case 0x32: - printf("8bM\n"); + //printf("C %d:%d: %02x%02x%02x\n", cdc->led.start, cdc->led.len, cdc->led.r, cdc->led.g, cdc->led.b); for (int i = 0; i < cdc->led.len; i++) { rgb_set_button(i + cdc->led.start, color, 0); } break; case 0x33: - printf("8bMF\n"); + //printf("F %d:%d: %02x%02x%02x %d\n", cdc->led.start, cdc->led.len, cdc->led.r, cdc->led.g, cdc->led.b, cdc->led.speed); for (int i = 0; i < cdc->led.len; i++) { rgb_set_button(i + cdc->led.start, color, cdc->led.speed); } break; case 0x39: - printf("Fet\n"); + //printf("Fet\n"); rgb_set_cab(0, gray32(cdc->led.body, false)); rgb_set_cab(1, gray32(cdc->led.ext, false)); rgb_set_cab(2, gray32(cdc->led.side, false)); break; case 0x3C: - printf("Upd\n"); + //printf("Upd\n"); break; case 0x82: - printf("Dir\n"); + //printf("Dir\n"); break; default: - printf("LEDUnk\n"); + printf("Unknown LED Cmd %02x\n", cdc->hdr.cmd); return; } } diff --git a/firmware/src/rgb.c b/firmware/src/rgb.c index 52d7f33..c42d5ba 100644 --- a/firmware/src/rgb.c +++ b/firmware/src/rgb.c @@ -22,12 +22,13 @@ #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +uint32_t rgb_buf[20]; static struct { - uint32_t color; + uint32_t color; // current color uint32_t target; // target color uint16_t duration; uint16_t elapsed; -} rgb_ctrl[20]; +} fade_ctx[20]; static const uint8_t button_led_map[] = RGB_BUTTON_MAP; #define _MAP_LED(x) _MAKE_MAPPER(x) @@ -111,10 +112,10 @@ static void drive_led() } last = now; - for (int i = 0; i < ARRAY_SIZE(rgb_ctrl); i++) { + for (int i = 0; i < ARRAY_SIZE(rgb_buf); i++) { int num = (i < 8) ? mai_cfg->rgb.per_button : mai_cfg->rgb.per_aux; for (int j = 0; j < num; j++) { - pio_sm_put_blocking(pio0, 0, rgb_ctrl[i].color << 8u); + pio_sm_put_blocking(pio0, 0, rgb_buf[i] << 8u); } } } @@ -125,24 +126,24 @@ static void fade_ctrl() uint64_t now = time_us_64(); uint32_t delta_ms = (now - last) / 1000; - if (delta_ms == 0) { + if (delta_ms < 4) { // no faster than 250Hz return; } - for (int i = 0; i < ARRAY_SIZE(rgb_ctrl); i++) { - if (rgb_ctrl[i].duration == 0) { + for (int i = 0; i < ARRAY_SIZE(fade_ctx); i++) { + if (fade_ctx[i].duration == 0) { continue; } - rgb_ctrl[i].elapsed += delta_ms; - if (rgb_ctrl[i].elapsed >= rgb_ctrl[i].duration) { - rgb_ctrl[i].color = rgb_ctrl[i].target; - rgb_ctrl[i].duration = 0; + fade_ctx[i].elapsed += delta_ms; + if (fade_ctx[i].elapsed >= fade_ctx[i].duration) { + fade_ctx[i].duration = 0; + rgb_buf[i] = fade_ctx[i].target; continue; } - uint8_t progress = rgb_ctrl[i].elapsed * 255 / rgb_ctrl[i].duration; - rgb_ctrl->color = lerp(rgb_ctrl->color, rgb_ctrl->target, progress); + uint8_t progress = fade_ctx[i].elapsed * 255 / fade_ctx[i].duration; + rgb_buf[i] = lerp(fade_ctx->color, fade_ctx->target, progress); } last = now; @@ -163,17 +164,18 @@ static inline uint32_t apply_level(uint32_t color) static void set_color(unsigned index, uint32_t color, uint8_t speed) { - if (index >= ARRAY_SIZE(rgb_ctrl)) { + if (index >= ARRAY_SIZE(fade_ctx)) { return; } if (speed > 0) { - rgb_ctrl[index].target = apply_level(color); - rgb_ctrl[index].duration = 32767 / speed; - rgb_ctrl[index].elapsed = 0; + fade_ctx[index].color= rgb_buf[index]; + fade_ctx[index].target = apply_level(color); + fade_ctx[index].duration = 32767 / speed; + fade_ctx[index].elapsed = 0; } else { - rgb_ctrl[index].color = apply_level(color); - rgb_ctrl[index].duration = 0; + rgb_buf[index] = apply_level(color); + fade_ctx[index].duration = 0; } }