/* * cmd_monitor.c * * Copyright (c) 2025 Umber Networks & Robert McMahon * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "esp_log.h" #include "esp_console.h" #include "argtable3/argtable3.h" #include "wifi_controller.h" #include "iperf.h" #include "app_console.h" // ============================================================================ // COMMAND: monitor // ============================================================================ static struct { struct arg_lit *start, *stop, *status, *save, *reload; struct arg_lit *clear_nvs; struct arg_int *channel; struct arg_lit *help; struct arg_end *end; } mon_args; static int cmd_monitor(int argc, char **argv) { int nerrors = arg_parse(argc, argv, (void **)&mon_args); if (nerrors > 0) { arg_print_errors(stderr, mon_args.end, argv[0]); return 1; } if (mon_args.help->count > 0) { printf("Usage: monitor [--start|--stop] [-c ] [--save|--reload]\n"); return 0; } // --- Actions: NVS Management --- if (mon_args.clear_nvs->count > 0) { wifi_ctl_param_clear(); printf("Monitor config cleared (Defaulting to Ch 6).\n"); app_console_update_prompt(); return 0; } if (mon_args.reload->count > 0) { wifi_ctl_param_reload(); printf("Config reloaded from NVS.\n"); } if (mon_args.channel->count > 0) { wifi_ctl_param_set_monitor_channel((uint8_t)mon_args.channel->ival[0]); printf("Channel set to %d (RAM).\n", mon_args.channel->ival[0]); } if (mon_args.save->count > 0) { if (wifi_ctl_param_save()) printf("Configuration saved to NVS.\n"); else printf("No changes to save (NVS matches RAM).\n"); } // --- Actions: Mode Switching --- if (mon_args.stop->count > 0) { wifi_ctl_switch_to_sta(WIFI_BW_HT20); printf("Switched to Station Mode.\n"); } if (mon_args.start->count > 0) { if (wifi_ctl_switch_to_monitor(0, WIFI_BW_HT20) == ESP_OK) printf("Monitor Mode Started.\n"); else printf("Failed to start Monitor Mode.\n"); } // --- Status --- if (mon_args.status->count > 0) { wifi_ctl_mode_t mode = wifi_ctl_get_mode(); printf("MONITOR STATUS:\n"); printf(" Mode: %s\n", (mode == WIFI_CTL_MODE_MONITOR) ? "MONITOR" : "STATION"); printf(" Active: Ch %d\n", (mode == WIFI_CTL_MODE_MONITOR) ? wifi_ctl_get_monitor_channel() : 0); printf(" Staged: Ch %d\n", wifi_ctl_param_get_monitor_channel()); printf(" Frames: %" PRIu32 "\n", wifi_ctl_get_monitor_frame_count()); } app_console_update_prompt(); return 0; } void register_monitor_cmd(void) { mon_args.start = arg_lit0(NULL, "start", "Start"); mon_args.stop = arg_lit0(NULL, "stop", "Stop"); mon_args.status = arg_lit0(NULL, "status", "Status"); mon_args.save = arg_lit0(NULL, "save", "Save"); mon_args.reload = arg_lit0(NULL, "reload", "Reload"); mon_args.clear_nvs = arg_lit0(NULL, "clear-nvs", "Clear NVS"); mon_args.channel = arg_int0("c", "channel", "", "Chan"); mon_args.help = arg_lit0("h", "help", "Help"); mon_args.end = arg_end(20); const esp_console_cmd_t cmd = { .command = "monitor", .help = "Monitor Mode", .func = &cmd_monitor, .argtable = &mon_args }; ESP_ERROR_CHECK(esp_console_cmd_register(&cmd)); }