From 7c1c90d1213dfd8c5413337b16df7ff207a642b9 Mon Sep 17 00:00:00 2001 From: whowechina Date: Sat, 6 Apr 2024 11:11:19 +0800 Subject: [PATCH] Optimize AIME commands --- .gitignore | 4 +- Production/Firmware/chu_pico.uf2 | Bin 147968 -> 149504 bytes firmware/modules/aic_pico | 2 +- firmware/src/commands.c | 75 ++++++++++++++++++++++--------- firmware/src/config.c | 5 ++- firmware/src/config.h | 5 ++- firmware/src/main.c | 3 +- 7 files changed, 68 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index d616d37..b476fc9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -chu_main-backups -Production/PCB/chu_main/* +*-backups +Production/PCB/*/* diff --git a/Production/Firmware/chu_pico.uf2 b/Production/Firmware/chu_pico.uf2 index 02a849b6eb41295bb00e2315131afaa8af1e044f..241e123585b7ff3807a07da2147b147e5b731526 100644 GIT binary patch delta 22763 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 Nz1pxmzxJ5&{{dXNM-Bi0 delta 22368 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 KwXJvirtual_aic ? "ON" : "OFF"); + printf(" NFC Module: %s\n", nfc_module_name()); + printf(" Virtual AIC: %s\n", chu_cfg->aime.virtual_aic ? "ON" : "OFF"); + printf(" Mode: %d\n", chu_cfg->aime.mode); } void handle_display(int argc, char *argv[]) { - const char *usage = "Usage: display [colors|style|tof|sense|hid]\n"; + const char *usage = "Usage: display [colors|style|tof|sense|hid|aime]\n"; if (argc > 1) { printf(usage); return; @@ -425,25 +426,59 @@ static void handle_nfc() printf("\n"); } -static void handle_virtual(int argc, char *argv[]) +static bool handle_aime_mode(const char *mode) { - const char *usage = "Usage: virtual \n"; - if (argc != 1) { - printf("%s", usage); - return; + if (strcmp(mode, "0") == 0) { + chu_cfg->aime.mode = 0; + } else if (strcmp(mode, "1") == 0) { + chu_cfg->aime.mode = 1; + } else { + return false; } - - const char *commands[] = { "on", "off" }; - int match = cli_match_prefix(commands, 2, argv[0]); - if (match < 0) { - printf("%s", usage); - return; - } - - chu_cfg->virtual_aic = (match == 0); - - aime_virtual_aic(chu_cfg->virtual_aic); + aime_set_mode(chu_cfg->aime.mode); config_changed(); + return true; +} + +static bool handle_aime_virtual(const char *onoff) +{ + if (strcasecmp(onoff, "on") == 0) { + chu_cfg->aime.virtual_aic = 1; + } else if (strcasecmp(onoff, "off") == 0) { + chu_cfg->aime.virtual_aic = 0; + } else { + return false; + } + aime_virtual_aic(chu_cfg->aime.virtual_aic); + config_changed(); + return true; +} + +static void handle_aime(int argc, char *argv[]) +{ + const char *usage = "Usage:\n" + " aime mode <0|1>\n" + " aime virtual \n"; + if (argc != 2) { + printf("%s", usage); + return; + } + + const char *commands[] = { "mode", "virtual" }; + int match = cli_match_prefix(commands, 2, argv[0]); + + bool ok = false; + if (match == 0) { + ok = handle_aime_mode(argv[1]); + } else if (match == 1) { + ok = handle_aime_virtual(argv[1]); + } + + if (ok) { + disp_aime(); + } else { + printf("%s", usage); + } } void commands_init() @@ -460,5 +495,5 @@ void commands_init() cli_register("save", handle_save, "Save config to flash."); cli_register("factory", handle_factory_reset, "Reset everything to default."); cli_register("nfc", handle_nfc, "NFC debug."); - cli_register("virtual", handle_virtual, "Virtual AIC card."); + cli_register("aime", handle_aime, "AIME settings."); } diff --git a/firmware/src/config.c b/firmware/src/config.c index cd5bc8b..41fe30f 100644 --- a/firmware/src/config.c +++ b/firmware/src/config.c @@ -38,7 +38,10 @@ static chu_cfg_t default_cfg = { .joy = 1, .nkro = 0, }, - .virtual_aic = false, + .aime = { + .mode = 0, + .virtual_aic = 0, + }, }; chu_runtime_t *chu_runtime; diff --git a/firmware/src/config.h b/firmware/src/config.h index 5194590..046e952 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -38,7 +38,10 @@ typedef struct __attribute__((packed)) { uint8_t joy : 4; uint8_t nkro : 4; } hid; - bool virtual_aic; + struct { + uint8_t mode : 4; + uint8_t virtual_aic : 4; + } aime; } chu_cfg_t; typedef struct { diff --git a/firmware/src/main.c b/firmware/src/main.c index fa30fd8..bd12e7e 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -220,7 +220,8 @@ void init() i2c_select(I2C_PORT, 1 << 5); // PN532 on IR1 (I2C mux chn 5) nfc_init(); aime_init(cdc_aime_putc); - aime_virtual_aic(chu_cfg->virtual_aic); + aime_virtual_aic(chu_cfg->aime.virtual_aic); + aime_set_mode(chu_cfg->aime.mode); cli_init("chu_pico>", "\n << Chu Pico Controller >>\n" " https://github.com/whowechina\n\n");