diff --git a/utils/pycli/skyeye_cli.py b/utils/pycli/skyeye_cli.py index ed34ce6120b75c5565c9931c433d562510327330..e9d70b8542595d49ae71022a279c410d26ccee80 100755 --- a/utils/pycli/skyeye_cli.py +++ b/utils/pycli/skyeye_cli.py @@ -54,9 +54,20 @@ def add_do_command_method(cls): print('!!!BUG!!!') return do_xxx + def create_complete_method(command): + def complete_xxx(self, text, line, begidx, endidx): + return command.complete(text, line, begidx, endidx) + # try: + # return command.complete(text, line, begidx, endidx) + # except: + # return [] + return complete_xxx + for name, command in skyeye_command._commands.items(): if 'cli' in command.export: setattr(cls, 'do_'+name, create_command_method(command)) + if not getattr(cls, 'complete_'+name, None): + setattr(cls, 'complete_'+name, create_complete_method(command)) return cls @@ -97,6 +108,9 @@ class SkyEyeCli(cmd.Cmd): # 命令参数解析器 self.cmd_parsers = {} + # 参数补齐时不截断形如xxx-yyy的命令 + self.identchars += '-/' + def print_welcome_message(self): os_info = platform.system() if operator.eq(os_info, "Linux"): @@ -117,9 +131,9 @@ class SkyEyeCli(cmd.Cmd): def readline_cfg(self): import readline s = readline.get_completer_delims() - for c in '<>-': + for c in '<>-/': s = s.replace(c, '') - s += '.' + #s += '.' readline.set_completer_delims(s) self.readline = readline @@ -143,7 +157,6 @@ class SkyEyeCli(cmd.Cmd): self.readline.write_history_file(self.history_file) def precmd(self, arg): - if arg: if arg.startswith('%'): arg = 'run_py ' + arg[1:] @@ -186,11 +199,29 @@ class SkyEyeCli(cmd.Cmd): def completedefault(self, text, line, begidx, endidx): # TODO: 实现参数补齐功能 - pass + cmd, args, foo = self.parseline(line) + if '-' in cmd: + cmd = cmd.replace('-', '_') + compfunc = getattr(self, 'complete_'+cmd, None) + if compfunc: + return compfunc(text, line, begidx, endidx) + return [] def default(self, line): print('[Error] Unknown command: %s\n'%line) + def complete(self, text, state): + #print('IN complete: text = "%s"' % text, state) + return super().complete(text, state) + + # def complete_get_pc(self, text, line, begidx, endidx): + # print('HOHOH') + # config = GetGlobalConfig() + # if not config: + # return None + # cpus = config.get_cpu_list() + # return [item for item in cpus if item.startswith(text)] + # def do_t(self, arg): # args = arg.split() # print(args) @@ -201,6 +232,3 @@ class SkyEyeCli(cmd.Cmd): # except Exception as e: # print(e) # raise e - -################################################################################ - diff --git a/utils/pycli/skyeye_command/_base_.py b/utils/pycli/skyeye_command/_base_.py index 22d0ee4e42591d8f97ccf8e90456d756d055d99f..11f657c46cdc1977838693dd00fc59cdccc9c79d 100644 --- a/utils/pycli/skyeye_command/_base_.py +++ b/utils/pycli/skyeye_command/_base_.py @@ -21,6 +21,21 @@ class SkyeyeCommand(ABC): def create_argparser(self): pass + def complete(self, text, line, begidx, endidx): + i = len(line.split()) + if begidx < endidx: + i -= 1 + try: + compfunc = getattr(self, 'complete_arg_%d' % i) + res = compfunc(text, line, begidx, endidx) + except AttributeError: + res = [] + except Exception as e: + print('DEBUG: COMPLETE BUG', e) + res = [] + + return res + def check_arg(self, arg): try: return self.argparser.parse_args(arg.split()) diff --git a/utils/pycli/skyeye_command/bp_create.py b/utils/pycli/skyeye_command/bp_create.py index e9f10eabd0a2a4b305b4ee482dcc88897bef2482..cd848662a56d48620dbcc82f105873d31e526e94 100644 --- a/utils/pycli/skyeye_command/bp_create.py +++ b/utils/pycli/skyeye_command/bp_create.py @@ -3,6 +3,7 @@ import argparse import os from skyeye_common_module import SkyEyeCreateBreakpoint from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig class Command(SkyeyeCommand): export = ['cli'] @@ -31,3 +32,15 @@ class Command(SkyeyeCommand): def call(self, arg='', arg_ns=None, cli=None, script=None, **meta): SkyEyeCreateBreakpoint(arg_ns.cpu, arg_ns.bp_addr) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/bp_delete.py b/utils/pycli/skyeye_command/bp_delete.py index bcdf9b19f796b4de464dbab36a7b537a2bdff18b..8c7f3cd91ccdb82341923e33313f88749981e7b8 100644 --- a/utils/pycli/skyeye_command/bp_delete.py +++ b/utils/pycli/skyeye_command/bp_delete.py @@ -1,8 +1,9 @@ from . import SkyeyeCommand, convert_int import argparse import os -from skyeye_common_module import SkyEyeDeleteBreakpointByAddr +from skyeye_common_module import * from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig class Command(SkyeyeCommand): export = ['cli'] @@ -31,3 +32,18 @@ class Command(SkyeyeCommand): def call(self, arg='', arg_ns=None, cli=None, script=None, **meta): SkyEyeDeleteBreakpointByAddr(arg_ns.cpu, arg_ns.bp_addr) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + cpu = line.split()[1] + temp = [] + n = SkyEyeGetBpNumbers(cpu) + for i in range(n): + temp.append(hex(SkyEyeGetBreakpointAddrById(cpu, i))) + return [item for item in temp if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/bp_list.py b/utils/pycli/skyeye_command/bp_list.py index 2ce24e974244023fc55af937b6e0033da7673a66..4ce9479106986eb3e1b70fc758bcef57e511bfb0 100644 --- a/utils/pycli/skyeye_command/bp_list.py +++ b/utils/pycli/skyeye_command/bp_list.py @@ -3,6 +3,7 @@ import argparse import os from skyeye_common_module import SkyEyeGetBpNumbers, SkyEyeGetBreakpointAddrById from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig class Command(SkyeyeCommand): export = ['cli'] @@ -31,3 +32,10 @@ class Command(SkyeyeCommand): print("%-25s0x%-25x" % (arg_ns.cpu, i)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/cd.py b/utils/pycli/skyeye_command/cd.py index a1f0e42c1b9afe05616bd6911e315711a4d2e01c..c0d4844c6364a885a3ee39899d55772955a99232 100644 --- a/utils/pycli/skyeye_command/cd.py +++ b/utils/pycli/skyeye_command/cd.py @@ -22,3 +22,14 @@ class Command(SkyeyeCommand): def call(self, arg='', arg_ns=None, cli=None, script=None, **meta): os.chdir(arg_ns.path) return False + + def complete_arg_1(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, _, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + return [item for item in dirs if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/define_conf.py b/utils/pycli/skyeye_command/define_conf.py index 54f9ea38e419e9a877dc6e22d98c229c872242df..6e8497c58a241b1938b4f696684f7361e8ceb2ee 100644 --- a/utils/pycli/skyeye_command/define_conf.py +++ b/utils/pycli/skyeye_command/define_conf.py @@ -42,3 +42,17 @@ class Command(SkyeyeCommand): cli.open_conf_flag = True return False + + def complete_arg_1(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files + if os.path.splitext(item)[1] == '.json'] + items = files + dirs + return [item for item in items if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/disable_device_work.py b/utils/pycli/skyeye_command/disable_device_work.py index eeb40983781de0b67c74a81d78110857e2aa90e7..a08b35f2035b9567dc156ac755ed9bb18ed59599 100644 --- a/utils/pycli/skyeye_command/disable_device_work.py +++ b/utils/pycli/skyeye_command/disable_device_work.py @@ -37,3 +37,10 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException(['0x40050000', e]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + dl = config.get_device_list() + return [item for item in dl if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/disassemble.py b/utils/pycli/skyeye_command/disassemble.py index 8ada4ab332eb40038bcf5ddf69c6ab775fbeb259..102e20b53321e4c444b5ec7e0631f4de2651708b 100644 --- a/utils/pycli/skyeye_command/disassemble.py +++ b/utils/pycli/skyeye_command/disassemble.py @@ -41,3 +41,15 @@ class Command(SkyeyeCommand): print ("%-20x%-20s" % (arg_ns.addr, disas_str)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/enable_device_work.py b/utils/pycli/skyeye_command/enable_device_work.py index 599a8e164b74b1ab6e538139ca603c2e3910f9b1..5b761f5fc96834a6664add983c827009dee4d4b0 100644 --- a/utils/pycli/skyeye_command/enable_device_work.py +++ b/utils/pycli/skyeye_command/enable_device_work.py @@ -38,3 +38,10 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException(['0x40080000', e]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + dl = config.get_device_list() + return [item for item in dl if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/fj_clear.py b/utils/pycli/skyeye_command/fj_clear.py index ebd4a9f511bbf38883b56212819138fc5a6cd629..8dc03b86de98fc6bb404a503565b8c79cf487fa7 100644 --- a/utils/pycli/skyeye_command/fj_clear.py +++ b/utils/pycli/skyeye_command/fj_clear.py @@ -59,3 +59,33 @@ class Command(SkyeyeCommand): print('Failure deletion successful.') return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] + + def complete_arg_4(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(8)] + return [] + + def complete_arg_5(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(3)] + return [] diff --git a/utils/pycli/skyeye_command/fj_set.py b/utils/pycli/skyeye_command/fj_set.py index c83b9faa36f05ff8537095ca307f633942524266..26f1cdeef4852f6d8cca694c0ed7ca3530a6e129 100644 --- a/utils/pycli/skyeye_command/fj_set.py +++ b/utils/pycli/skyeye_command/fj_set.py @@ -59,3 +59,33 @@ class Command(SkyeyeCommand): print("Injection failure success") return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] + + def complete_arg_4(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(8)] + return [] + + def complete_arg_5(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(3)] + return [] diff --git a/utils/pycli/skyeye_command/get_pc.py b/utils/pycli/skyeye_command/get_pc.py index 34fe9ff36474dcbe1effe75c050e9a114cad1265..990586bec31241754ea4e0ba52755c4335ecedcf 100644 --- a/utils/pycli/skyeye_command/get_pc.py +++ b/utils/pycli/skyeye_command/get_pc.py @@ -39,3 +39,10 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException(['0x40200000', e]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_attr.py b/utils/pycli/skyeye_command/list_attr.py index ef2858ebf04fe48236afbc330ebe42c14bbdbb93..8e2b39cb8abdfd0d93c87a668109daa66a96bf5a 100644 --- a/utils/pycli/skyeye_command/list_attr.py +++ b/utils/pycli/skyeye_command/list_attr.py @@ -47,3 +47,7 @@ class Command(SkyeyeCommand): print("%-20s%-20s%s" % (info_l[0], info_l[1], destription)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + cls_l = SkyEyeGetClassList() + return [item for item in cls_l if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_connect.py b/utils/pycli/skyeye_command/list_connect.py index 731523ce88b22b2bc2206b6e927f8cf5228b4a37..f8a9c9d09bca49021add535944fc86ce65761e15 100644 --- a/utils/pycli/skyeye_command/list_connect.py +++ b/utils/pycli/skyeye_command/list_connect.py @@ -33,3 +33,7 @@ class Command(SkyeyeCommand): table_print(connect_l) return False + + def complete_arg_1(self, text, line, begidx, endidx): + cls_l = SkyEyeGetClassList() + return [item for item in cls_l if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_device.py b/utils/pycli/skyeye_command/list_device.py index 09038de0141c3346c38d3fd6be219e7a033371e9..1af8b05ee74316ef5962a145f88dd751211a711a 100644 --- a/utils/pycli/skyeye_command/list_device.py +++ b/utils/pycli/skyeye_command/list_device.py @@ -51,3 +51,10 @@ class Command(SkyeyeCommand): print ("%-30s%-30s" % (i+1, device_list[i])) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_iface.py b/utils/pycli/skyeye_command/list_iface.py index 569f64a64663b1f24655f6986f22f2dd5f0e91a6..37656a61739970a33994a1431f1dd56e04fbde26 100644 --- a/utils/pycli/skyeye_command/list_iface.py +++ b/utils/pycli/skyeye_command/list_iface.py @@ -34,3 +34,7 @@ class Command(SkyeyeCommand): table_print(iface_l) return False + + def complete_arg_1(self, text, line, begidx, endidx): + cls_l = SkyEyeGetClassList() + return [item for item in cls_l if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_register.py b/utils/pycli/skyeye_command/list_register.py index e16af1935c267a6c1c00743368e80f23a421240d..a350a4bcd77319d456ebb79da9be2a086b34c570 100644 --- a/utils/pycli/skyeye_command/list_register.py +++ b/utils/pycli/skyeye_command/list_register.py @@ -44,3 +44,18 @@ class Command(SkyeyeCommand): print ("%-20s%-20x%-20x" % (i, ret[i]["value"], ret[i]["addr"])) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/load_binary.py b/utils/pycli/skyeye_command/load_binary.py index a3f716fa883854c6e0114a2274d9c319a233c8eb..d8e7ea874077684913336f27ca135ac00e6e12b6 100644 --- a/utils/pycli/skyeye_command/load_binary.py +++ b/utils/pycli/skyeye_command/load_binary.py @@ -47,3 +47,24 @@ class Command(SkyeyeCommand): binary_l[arg_ns.cpu] = path return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files] + items = files + dirs + return [item for item in items if item.startswith(text)] + diff --git a/utils/pycli/skyeye_command/load_file.py b/utils/pycli/skyeye_command/load_file.py index 80be41638022d123a9d7efad2757031349713d56..e5a1401cc7183996bd313e1938c370e47ceb7d61 100644 --- a/utils/pycli/skyeye_command/load_file.py +++ b/utils/pycli/skyeye_command/load_file.py @@ -58,3 +58,28 @@ class Command(SkyeyeCommand): SkyEyeLoadFile(arg_ns.cpu, path, arg_ns.addr) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files] + items = files + dirs + return [item for item in items if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/md.py b/utils/pycli/skyeye_command/md.py index 138aa5f57b5e01ce63801613a5a631284a500c15..6c7d0b19f4eea29a4da22af8654bbaff868e4f20 100644 --- a/utils/pycli/skyeye_command/md.py +++ b/utils/pycli/skyeye_command/md.py @@ -41,3 +41,15 @@ class Command(SkyeyeCommand): print ("%-20x%-20x" % (arg_ns.addr, ret)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/mm_info.py b/utils/pycli/skyeye_command/mm_info.py index cd1e502e6885d771b8edfcd3d11d3c59cbcbc80a..f942e6640d3f6ba64b0aa2eb76997d5103df9ae3 100644 --- a/utils/pycli/skyeye_command/mm_info.py +++ b/utils/pycli/skyeye_command/mm_info.py @@ -28,3 +28,11 @@ class Command(SkyeyeCommand): SkyEyeMemoryInfo(arg_ns.func) return False + + def complete_arg_1(self, text, line, begidx, endidx): + funcs = [ + 'mm', 'mm_zero', 'strdup', 'mm_align', + 'align_free', 'free', 'realloc', + ] + + return [item for item in funcs if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/reverse.py b/utils/pycli/skyeye_command/reverse.py index 024fc14da8b61c70384597ed50ee64cf2703e735..5704601e85ace2522b5d46e9044b57a67611f92e 100644 --- a/utils/pycli/skyeye_command/reverse.py +++ b/utils/pycli/skyeye_command/reverse.py @@ -85,3 +85,10 @@ class Command(SkyeyeCommand): SkyEyeStepi(core, "%d" % run_steps) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/run_script.py b/utils/pycli/skyeye_command/run_script.py index af8e91dcaf566bb7cb45e89be96434a7af5aa3b9..454cc103d73eab0783c03f38b82550167b997a74 100644 --- a/utils/pycli/skyeye_command/run_script.py +++ b/utils/pycli/skyeye_command/run_script.py @@ -56,3 +56,17 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException([ERROR_ALL_F, msg]) commands.append((command, arg)) return commands + + def complete_arg_1(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files + if os.path.splitext(item)[1] == '.skyeye'] + items = files + dirs + return [item for item in items if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/set_mode.py b/utils/pycli/skyeye_command/set_mode.py index 1fbadb4323d964956e5d3d58d06268f7c15149cc..c58da6c900fdb6ab5db422c32c1230e1c3ac156f 100644 --- a/utils/pycli/skyeye_command/set_mode.py +++ b/utils/pycli/skyeye_command/set_mode.py @@ -34,3 +34,8 @@ class Command(SkyeyeCommand): print ("--%d--" % arg_ns.mode) SetAllToDyncom(arg_ns.mode) return False + + def complete_arg_1(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(4)] + return [] diff --git a/utils/pycli/skyeye_command/set_pc.py b/utils/pycli/skyeye_command/set_pc.py index aed30838ab5977df6511beb2e93b460c1b1a2053..705aabc4209d1def64a31b885bedb86770d33538 100644 --- a/utils/pycli/skyeye_command/set_pc.py +++ b/utils/pycli/skyeye_command/set_pc.py @@ -39,3 +39,15 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException([ERROR_ALL_F, msg]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/set_register.py b/utils/pycli/skyeye_command/set_register.py index 6118a126e27585281beae9004821db1421e47da1..e265d70d35a8180430cf47ac1e9bbcec1ab929f2 100644 --- a/utils/pycli/skyeye_command/set_register.py +++ b/utils/pycli/skyeye_command/set_register.py @@ -31,7 +31,7 @@ class Command(SkyeyeCommand): parser.add_argument( 'register', metavar='', - help='device name', + help='register name', ) parser.add_argument( @@ -48,3 +48,32 @@ class Command(SkyeyeCommand): ret = SkyEyeSetDevRegValueById(arg_ns.machine, arg_ns.device, arg_ns.value, regid) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + _, mach, device, *_ = line.split() + ret = sfi.get_device_register_info(mach, device) + if not ret: + return [] + # FIXME + items = [item.decode('utf-8') for item in ret] + return [item for item in items if item.startswith(text)] + + def complete_arg_4(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/stepi.py b/utils/pycli/skyeye_command/stepi.py index f4741aac73332d546d2ba6cc6131a03a30fe5a83..76ee1b91e504c12ada676cef326d8fff10c5d006 100644 --- a/utils/pycli/skyeye_command/stepi.py +++ b/utils/pycli/skyeye_command/stepi.py @@ -35,3 +35,10 @@ class Command(SkyeyeCommand): SkyEyeStepi(arg_ns.cpu, str(arg_ns.size)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)]