import cmd import typer from rich.console import Console from rich.table import Table def is_valid_number(number): if number < 0: raise typer.BadParameter("Number must be positive.") return number class CMDInterface(cmd.Cmd): intro = "Type help or ? to list commands.\n" prompt = "?> " file = None doc_header = "Commands" misc_header = "Misc Commands" undoc_header = "Undocumented Commands" def __init__(self, faulty_worker): super().__init__() self.faulty_worker = faulty_worker def do_config(self, args): """Configure the FaultyCat.""" print("Configuring the FaultyCat...") table_config = Table(title="Board configuration") table_config.add_column("Parameter", style="cyan") table_config.add_column("Value", style="magenta") table_config.add_row( "Serial port", f"{self.faulty_worker.board_uart.serial_worker.port}" ) table_config.add_row( "Pulse time", f"{self.faulty_worker.board_configurator.BOARD_CONFIG['pulse_time']}", ) table_config.add_row( "Pulse power", f"{self.faulty_worker.board_configurator.BOARD_CONFIG['pulse_power']}", ) table_config.add_row("Pulse count", f"{self.faulty_worker.pulse_count}") Console().print(table_config) def do_set(self, args): """Set a parameter.""" print("Setting a parameter...") args_list = args.split() if args == "help" or args == "?": print("Available parameters:") print("\t[time] pulse_time") print("\t[count] pulse_count") print("\tport") return if len(args_list) != 2: print("Invalid number of arguments.") return if args_list[0] == "pulse_time" or args_list[0] == "time": self.faulty_worker.set_pulse_time(is_valid_number(float(args_list[1]))) if args_list[0] == "pulse_count" or args_list[0] == "count": self.faulty_worker.set_pulse_count(is_valid_number(int(args_list[1]))) if args_list[0] == "port": self.faulty_worker.set_serial_port(args_list[1]) if not self.faulty_worker.validate_serial_connection(): typer.secho("Invalid serial port.", fg=typer.colors.BRIGHT_RED) return self.do_config(args) def do_start(self, args): """Start the FaultyCat.""" print("Starting the FaultyCat...") self.faulty_worker.start_faulty_attack() def do_exit(self, line): """Exit the CLI.""" return True