esp32 console 源码关键部分解析

相关源码路径: \examples\system\console\components\cmd_system

这个框架实际就是一个现成构架好的命令字,参数以及回调函数的框架,只要我们按照规范填写对应的参数,就能实现一个完整的console命令。

流程框架

    // 第1步:
    /*参数段设置*/
    // 第2步:
    /*命令结构体配置*/
    // 第3步:将命令结构体插入命令序列
    ESP_ERROR_CHECK(esp_console_cmd_register(&cmd));

第1步,参数段说明

我们找一个例子说明,其他的都是类似的步骤。

    int num_args                = 1;
    deep_sleep_args.wakeup_time = arg_int0("t", "time", "<t>", "Wake up time, ms");
#if SOC_PM_SUPPORT_EXT_WAKEUP
    deep_sleep_args.wakeup_gpio_num = arg_int0(NULL, "io", "<n>", "If specified, wakeup using GPIO with given number");
    deep_sleep_args.wakeup_gpio_level = arg_int0(NULL, "io_level", "<0|1>", "GPIO level to trigger wakeup");
    num_args += 2;
#endif
    deep_sleep_args.end = arg_end(num_args);

字段

deep_sleep_args 是用户创建的结构体,这个根据实际需要创建,例子中用的是int做参数,所以结构体主要是 arg_int, 以此类推,你可以选择arg_rem、arg_lit、arg_db1、arg_str等等。

这个结构体定义的最后一个成员是固定的 end,用来限制参数的个数。

参数构造函数

arg_int0:表示当前字段最多一个参数,可以为空,类型为int。
arg_int1:标识当前为一个必填字段,类型为int。
arg_intn:以此类推。

如果是其他类型,就有其他类似arg_xxx的参数构造函数。

我们具体以上面的内容为例子

arg_int0("t", "time", "<t>", "Wake up time, ms");

其中有4个成员,分别是:

  • "t":参数字段简写
  • "time":参数字段全拼
  • "< t >":参数类型,t表示时间值
  • "Wake up time, ms":参数功能描述

第2步,命令结构体

源码例子:

 const esp_console_cmd_t cmd = {
        .command = "deep_sleep",
        .help =
            "Enter deep sleep mode. "
#if SOC_PM_SUPPORT_EXT_WAKEUP
            "Two wakeup modes are supported: timer and GPIO. "
#else
            "Timer wakeup mode is supported. "
#endif
            "If no wakeup option is specified, will sleep indefinitely.",
        .hint     = NULL,
        .func     = &deep_sleep,
        .argtable = &deep_sleep_args
    };

其中 command、help、hint、func、argtable 是系统的固定定义,分别表示:

  1. command:命令字
  2. help:帮助说明
  3. hint:参数详细说明,为NULL时,由系统生成
  4. func:回调函数
  5. argtable:参数列表

第3步,开发自己的命令行

从上面的内容可以知道,我们要设计自己的命令行需要做一下工作:

  1. 设计完整的命令。
  2. 拆分出命令字,参数,搞清楚参数的类型和个数。
  3. 填写deep_sleep_args参数结构(填写实际的对象,这里只是举例)。
  4. 填写 esp_console_cmd_t cmd对象。
  5. 实现回调函数,这个也是最主要的内容。
  6. 将cmd将入系统命令队列。

到这里,我们就实现了自己的命令行,是不是很简单,主要的工作量都在准确实现参数列表和回调上。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注