一个最简单的CLI命令行界面实现
来源:互联网 发布:域名可以用来干什么 编辑:程序博客网 时间:2024/05/22 22:15
#include "system.h"#include "utils/ui.h"#include "appl/cli.h"/*cli命令行界面,一共可以注册MAX_CLI_COMMANDS 个命令,命令名字可以是[A-Z,a-z,0-9]的某个字母。运行效果:CMD> F - Flash utilities f - Write factory mac address n - Write the serial number d - Dump the mac address and serial numberEnter your choice: fMac: 00-22-44-66-88-00*/#if CFG_CLI_ENABLED#define MAX_CLI_COMMANDS (26+26+10) /* Lower + upper + digit *//* Commands forward */APISTATIC void cli_cmd_list_commands(CLI_CMD_OP op) REENTRANT;APISTATIC void cli_cmd_command_help(CLI_CMD_OP op) REENTRANT;extern void APIFUNC(cli_init)(void) REENTRANT;/* * Command list * * Note: We use STATIC initializer because commands could be added during * system initialization phase. */STATIC CLI_CMD_FUNC cmds[MAX_CLI_COMMANDS]; //命令列表/*查找所有已添加命令并执行命令描述*/APISTATIC voidAPIFUNC(cli_cmd_list_commands)(CLI_CMD_OP op) REENTRANT{ if (op == CLI_CMD_OP_HELP) { sal_printf("Help - List all available commands\n"); } else if (op == CLI_CMD_OP_DESC) { sal_printf("List all commands"); } else { uint8 i; CLI_CMD_FUNC *pcmd = &cmds[0]; for(i=0; i<MAX_CLI_COMMANDS; i++, pcmd++) { if (*pcmd) { char c = i < 26 ? ('a' + i) : (i < 52? ('A' + i - 26) : '0' + i - 52); sal_printf(" %c - ", c); (*(*pcmd))(CLI_CMD_OP_DESC); sal_printf("\n"); } } }}/*查找所有已添加命令并执行命令帮助*/APISTATIC voidAPIFUNC(cli_cmd_command_help)(CLI_CMD_OP op) REENTRANT{ if (op == CLI_CMD_OP_HELP) { sal_printf("Help - Show help information for a command\n"); } else if (op == CLI_CMD_OP_DESC) { sal_printf("Help for a command"); } else { char cmd; CLI_CMD_FUNC *pcmd; sal_printf("Command: "); cmd = sal_getchar(); sal_printf("\n"); if (cmd >= 'a' && cmd <= 'z') { pcmd = &cmds[cmd - 'a']; } else if (cmd >= 'A' && cmd <= 'Z') { pcmd = &cmds[26 + cmd - 'A']; } else if (cmd >= '0' && cmd <= '9') { pcmd = &cmds[52 + cmd - '0']; } else if (cmd == '\r' || cmd == '\n') { return; } else { sal_printf("Invalid command\n"); return; } if (*pcmd == NULL) { sal_printf("Command not available\n"); return; } sal_printf("\n"); (*(*pcmd))(CLI_CMD_OP_HELP); }}/*cli任务,用于跟用户交互*/voidAPIFUNC(cli)(void) REENTRANT{ for(;;) { char cmd; CLI_CMD_FUNC *pcmd; sal_printf("\n" CFG_CLI_PROMPT);//打印”CMD> ”字符串 cmd = sal_getchar();//获取用户输入命令 if (cmd >= 'a' && cmd <= 'z') { pcmd = &cmds[cmd - 'a']; } else if (cmd >= 'A' && cmd <= 'Z') { pcmd = &cmds[26 + cmd - 'A']; } else if (cmd >= '0' && cmd <= '9') { pcmd = &cmds[52 + cmd - '0']; } else if (cmd == UI_KB_LF || cmd == UI_KB_ESC || cmd == UI_KB_BS || cmd == UI_KB_CR) { ui_backspace(); sal_putchar('\n'); continue; } else { sal_printf("\nInvalid command\n"); continue; } if (*pcmd == NULL) { sal_printf("\nCommand not available\n"); continue; }/*执行命令*/ sal_printf(" - "); (*(*pcmd))(CLI_CMD_OP_DESC); sal_printf("\n"); (*(*pcmd))(CLI_CMD_OP_EXEC); }}/*添加注册命令*/BOOLAPIFUNC(cli_add_cmd)(char cmd, CLI_CMD_FUNC func) REENTRANT{ CLI_CMD_FUNC *pcmd = NULL; SAL_ASSERT(func); if (func == NULL) { return FALSE; } if (cmd >= 'a' && cmd <= 'z') { pcmd = &cmds[cmd - 'a']; } else if (cmd >= 'A' && cmd <= 'Z') { pcmd = &cmds[26 + cmd - 'A']; } else if (cmd >= '0' && cmd <= '9') { pcmd = &cmds[52 + cmd - '0']; } else { SAL_ASSERT(FALSE); return FALSE; } SAL_ASSERT(*pcmd == NULL); if (*pcmd != NULL) { return FALSE; } *pcmd = func; return TRUE;}/*移除注册命令*/voidAPIFUNC(cli_remove_cmd)(char cmd) REENTRANT{ CLI_CMD_FUNC *pcmd = NULL; if (cmd >= 'a' && cmd <= 'z') { pcmd = &cmds[cmd - 'a']; } else if (cmd >= 'A' && cmd <= 'Z') { pcmd = &cmds[26 + cmd - 'A']; } else if (cmd >= '0' && cmd <= '9') { pcmd = &cmds[52 + cmd - '0']; } else { SAL_ASSERT(FALSE); return; } *pcmd = NULL;}/*CLI初始化*/voidAPIFUNC(cli_init)(void) REENTRANT{ uint8 i; for(i=0; i<MAX_CLI_COMMANDS; i++) { cmds[i] = NULL; } /*注册2个默认命令*/cli_add_cmd('h', cli_cmd_list_commands); cli_add_cmd('H', cli_cmd_command_help);}#endif /* CFG_CLI_ENABLED */
0 0
- 一个最简单的CLI命令行界面实现
- cli - 命令行界面
- 一个好的命令行CLI库
- go实现命令行的工具cli
- 使用Cordova命令行界面(CLI)
- 程序员的底色(IDE color scheme、CLI 命令行界面)
- Mac下安装SpringBoot的CLI(命令行界面)
- 一个简单的计算器界面实现
- Android:一个简单查询界面的实现
- 实现一个简单的欢迎界面
- 一个简单聊天界面的UI实现
- Django - 一个简单的界面显示实现
- java实现一个简单的登录界面
- 一个简单的node.js实现界面
- Kotlin实现一个简单的登录界面
- ionic最简单的一种路由,写在一个界面上
- 实现一个最简单的嵌入式操作系统
- 一个最简单的监听器实现
- Dubbo--HelloWorld
- Code Forces 559 B. Equivalent Strings(递归)
- Scala进阶编程指南
- linux命令
- MySQL:索引工作原理
- 一个最简单的CLI命令行界面实现
- HDU pie (二分查找)
- 两道水题
- 域:一款抽象的射击游戏
- poj 2062 Card Game Cheater(排序+模拟)
- 【CODEFORCES】 B. Dreamoon and Sets
- Redis命令执行全过程
- 深度学习工具箱和Vlfeat库的配置及使用
- 卡塔尼亚中文离线地图App上线