diff --git a/components/Serial_Console/CMakeLists.txt b/components/Serial_Console/CMakeLists.txt index 94c73e9..e2c861d 100644 --- a/components/Serial_Console/CMakeLists.txt +++ b/components/Serial_Console/CMakeLists.txt @@ -2,6 +2,7 @@ idf_component_register( SRCS "Console.c" "Commands/Log_Command.c" + "Commands/KEvent_Command.c" "Commands/System_Command.c" INCLUDE_DIRS "." diff --git a/components/Serial_Console/Commands/KEvent_Command.c b/components/Serial_Console/Commands/KEvent_Command.c new file mode 100644 index 0000000..455b41b --- /dev/null +++ b/components/Serial_Console/Commands/KEvent_Command.c @@ -0,0 +1,99 @@ +/* + * This program source code file is part of the KTag project, a DIY laser tag + * game with customizable features and wide interoperability. + * + * 🛡 🃞 + * + * Copyright © 2026 Joseph P. Kearney and the KTag developers. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * There should be a copy of the GNU Affero General Public License in the LICENSE + * file in the root of this repository. If not, see . + */ + +#include +#include +#include +#include +#include +#include "esp_console.h" +#include "esp_log.h" +#include "SystemK.h" + +static uint32_t parse_uint32(const char *str, bool *ok) +{ + char *end; + errno = 0; + unsigned long val = strtoul(str, &end, 10); + + if (errno != 0 || end == str || *end != '\0' || val > UINT32_MAX) + { + *ok = false; + return 0; + } + + *ok = true; + return (uint32_t)val; +} + +static void print_usage(void) +{ + printf( + "Usage:\n" + " KEvent \n" + " (Note that IDs may be SystemK version-dependent.)\n"); +} + +static int cmd_KEvent(int argc, char **argv) +{ + KEvent_T event; + uint32_t data; + + if (argc < 2) + { + print_usage(); + return 0; + } + + if (Parse_KEvent_ID(argv[1], &event) == SYSTEMK_RESULT_SUCCESS) + { + bool ok; + data = parse_uint32(argv[2], &ok); + if (ok == true) + { + event.Data = (void *)data; + Post_KEvent(&event); + return 0; + } + else + { + printf("ERROR: Couldn't parse data!"); + return (-1); + } + } + else + { + printf("ERROR: Couldn't parse SystemK event!"); + return (-1); + } +} + +void Register_KEvent_Command(void) +{ + const esp_console_cmd_t cmd = { + .command = "KEvent", + .help = "Send arbitrary KEvents by ID", + .func = &cmd_KEvent, + }; + + ESP_ERROR_CHECK(esp_console_cmd_register(&cmd)); +} \ No newline at end of file diff --git a/components/Serial_Console/Commands/KEvent_Command.h b/components/Serial_Console/Commands/KEvent_Command.h new file mode 100644 index 0000000..6983267 --- /dev/null +++ b/components/Serial_Console/Commands/KEvent_Command.h @@ -0,0 +1,23 @@ +/* + * This program source code file is part of the KTag project, a DIY laser tag + * game with customizable features and wide interoperability. + * + * 🛡 🃞 + * + * Copyright © 2026 Joseph P. Kearney and the KTag developers. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * There should be a copy of the GNU Affero General Public License in the LICENSE + * file in the root of this repository. If not, see . + */ + +void Register_KEvent_Command(void); diff --git a/components/Serial_Console/Console.c b/components/Serial_Console/Console.c index 80e59d5..17ba64d 100644 --- a/components/Serial_Console/Console.c +++ b/components/Serial_Console/Console.c @@ -21,11 +21,13 @@ */ #include "esp_console.h" +#include #include #include static void register_commands() { + Register_KEvent_Command(); Register_Log_Command(); Register_System_Command(); esp_console_register_help_command(); diff --git a/components/SystemK b/components/SystemK index 45df6f9..5aeffbc 160000 --- a/components/SystemK +++ b/components/SystemK @@ -1 +1 @@ -Subproject commit 45df6f952abb82c2825a8bb16783c10a150adeba +Subproject commit 5aeffbcbc998ab13d2a14a1a53ddc335750e6f12