1
0
mirror of https://github.com/NevermindZZT/letter-shell.git synced 2025-01-21 10:02:54 +08:00
Letter 6c555d42ea 修复 passthrough模式bug
新增 passthrough直接单次透传
2021-06-02 22:04:55 +08:00
..
2021-06-02 22:04:55 +08:00
2020-10-18 16:00:55 +08:00
2020-10-18 16:00:55 +08:00

shell_enhance

version standard build license

简介

shell_enhanceletter shell 3.0上用于增强shell功能的组件shell_enhance分离了一些不常用的shell功能对于需要这些功能的用户只需要将对应的文件加入到编译系统中即可

组件

shell_enhance目前包含的组件如下:

组件 描述 依赖文件
shell_cmd_group 提供命令组功能 shell_cmd_group.c shell_cmd_group.h
shell_passthrough 提供透传功能 shell_passthrough.c shell_passthrough.h

shell_cmd_group

shell_cmd_group提供了一个命令组的功能,用户可以将多个相关的命令打包成一个命令组,然后通过形如cmdgroup subcmd [param]的方式进行命令调用

  • 定义命令数组

    命令数组用于将多个命令关联到一个数组,这个数组就是定义命令组需要的,你需要想正常命令一样,为每个子命令对应定义一个函数,然后将他们添加到一个数组中,可以使用宏SHELL_CMD_GROUP_ITEM进行定义

    int test(int a, char *b)
    {
        printf("hello world, %d, %s\r\n", a, b);
        return 0;
    }
    
    int test2(int argc, char *argv[])
    {
        printf("%d parameters\r\n", argc);
        for (short i = 0; i < argc; i++)
        {
            printf("%s\t", argv[i]);
        }
        printf("\r\n");
    }
    
    ShellCommand testGroup[] =
    {
        SHELL_CMD_GROUP_ITEM(SHELL_TYPE_CMD_FUNC, test, test, command group test1),
        SHELL_CMD_GROUP_ITEM(SHELL_TYPE_CMD_MAIN, test2, test2, command group test2),
        SHELL_CMD_GROUP_END()
    };
    

    其中SHELL_CMD_GROUP_END()需要写在每个命令数组的最后

  • 定义命令组

    使用宏SHELL_EXPORT_CMD_GROUP定义命令组

    SHELL_EXPORT_CMD_GROUP(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), gt, testGroup, command group test);
    
  • 调用

    在命令行,使用cmdgroup subcmd [param]的形式调用命令

    letter:/$ gt test 666 Letter
    hello world, 666, Letter
    Return: 0, 0x00000000
    
    letter:/$ gt test2 hello world
    3 parameters
    test2   hello   world
    Return: 0, 0x00000000
    
  • 命令帮助

    通过使用cmdgroup -h的方式查看完整的命令帮助信息

    letter:/$ gt -h
    command group help of gt
    test: command group test1
    test2: command group test2
    Return: 0, 0x00000000
    

shell_passthrough

shell_passthrough提供了一个透传模式的功能,用户可以定义一个透传命令,执行透传命令后进入对应的透传模式,此后,命令行接收到的数据将以行为单位透传到定义的handler此扩展适用于一些需要进行终端数据转发的场景常见的场景比如说通过命令行发送AT指令

  • 定义hanadler

    passthrough模式需要定义一个函数用于处理命令行传过来的数据函数原型为typedef int (*ShellPassthrough)(char *data, unsigned short len)

    void shellPassthroughTest(char *data, unsigned short len)
    {
        printf("passthrough mode test, data: %s, len: %d\r\n", data, len);
    }
    
  • 定义passthrough

    使用宏SHELL_EXPORT_PASSTROUGH定义passthrough

    SHELL_EXPORT_PASSTROUGH(SHELL_CMD_PERMISSION(0), passTest, passthrough>>, shellPassthroughTest, passthrough mode test);
    
  • 调用

    直接在命令行输入定义的passthrough名字可进入对应的透传模式,之后在输入的数据会按照行为单位通过handler调用

    letter:/mnt/f/Github/letter shell/demo/x86-gcc$ passTest
    passthrough>>hello
    passthrough mode test, data: hello, len: 5
    
  • 退出

    使用组合键Ctrl + D退出passthrough,键值可以在shell_passthrough.h文件中的SHELL_PASSTHROUGH_EXIT_KEY宏修改

  • 单次调用

    某些情况下,使用passthrough模式时,我们可能只需要单词数据的透传,此时可以不进入passthrough命令行,直接调用命令带上透传的数据即可

    letter:/mnt/f/Github/letter shell/demo/x86-gcc$ passTest "hello world"
    passthrough mode test, data: hello world, len: 11