mirror of
https://gitee.com/moluo-tech/AT-Command
synced 2025-06-18 08:27:51 +00:00
116 lines
4.0 KiB
C
116 lines
4.0 KiB
C
/******************************************************************************
|
|
* @brief 命令行处理
|
|
*
|
|
* Copyright (c) 2015-2022, <master_roger@sina.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2015-06-09 Morro 初版
|
|
*
|
|
* 2017-07-04 Morro 优化字段分割处理
|
|
*
|
|
* 2020-07-05 roger.luo 使用cli_obj_t对象, 支持多个命令源处理
|
|
* 2021-08-29 roger.luo 支持AT指令解析及回显控制
|
|
* 2022-02-16 roger.luo 添加命令行守卫处理程序
|
|
******************************************************************************/
|
|
#ifndef _CMDLINE_H_
|
|
#define _CMDLINE_H_
|
|
|
|
#include "comdef.h"
|
|
|
|
#define CLI_MAX_CMD_LEN 256 /*命令行长度*/
|
|
#define CLI_MAX_ARGS 16 /*最大参数个数*/
|
|
#define CLI_MAX_CMDS 64 /*最大允许定义的命令个数*/
|
|
|
|
/**
|
|
* @brief CLI作为AT解析器使用,在接收匹配时自动过滤"AT+",
|
|
*/
|
|
#define CLI_AT_ENABLE 1
|
|
|
|
/*命令类型 */
|
|
#define CLI_CMD_TYPE_EXEC 0 /* 普通执行命令*/
|
|
#define CLI_CMD_TYPE_QUERY 1 /* 查询命令 (XXX?)*/
|
|
#define CLI_CMD_TYPE_SET 2 /* 设备命令 (XXX=YY)*/
|
|
|
|
struct cli_obj;
|
|
|
|
/*命令项定义*/
|
|
typedef struct {
|
|
char *name; /*命令名*/
|
|
/**
|
|
* @brief 命令处理程序,类型
|
|
* @params o - cli 对象
|
|
* @params argc - 命令参数个数
|
|
* @params argv - 命令参数表
|
|
* @return 命令执行结果, 对于AT指令, 返回true时会自动响应OK,返回false时则
|
|
* 响应ERROR
|
|
*/
|
|
int (*handler)(struct cli_obj *o, int argc, char *argv[]);
|
|
const char *brief; /*命令简介*/
|
|
void *reserved;
|
|
}cmd_item_t;
|
|
|
|
#define __cmd_register(name,handler,brief)\
|
|
USED ANONY_TYPE(const cmd_item_t,__cli_cmd_##handler)\
|
|
SECTION("cli.cmd.1") = {name, handler, brief}
|
|
|
|
/*******************************************************************************
|
|
* @brief 命令注册
|
|
* @params name - 命令名
|
|
* @params handler - 命令处理程序
|
|
* 类型:int (*handler)(struct cli_obj *s, int argc, char *argv[]);
|
|
* @params brief - 使用说明
|
|
*/
|
|
#define cmd_register(name,handler,brief)\
|
|
__cmd_register(name,handler,brief)
|
|
|
|
/*cli 接口定义 -------------------------------------------------------------*/
|
|
typedef struct {
|
|
/**
|
|
* @brief 通信数据(串口)写接口
|
|
*/
|
|
unsigned int (*write)(const void *buf, unsigned int len);
|
|
/**
|
|
* @brief 通信数据(串口)读接口
|
|
*/
|
|
unsigned int (*read) (void *buf, unsigned int len);
|
|
|
|
/**
|
|
* @brief 命令行守卫程序(不需要则填写NULL,允许所有命令执行)
|
|
* @retval true - 允许执行, false - 忽略此命令
|
|
*/
|
|
int (*cmd_guard)(char *cmdline);
|
|
|
|
}cli_port_t;
|
|
|
|
/*命令行对象*/
|
|
typedef struct cli_obj {
|
|
int (*guard)(char *cmdline);
|
|
unsigned int (*write)(const void *buf, unsigned int len);
|
|
unsigned int (*read) (void *buf, unsigned int len);
|
|
void (*print)(struct cli_obj *this, const char *fmt, ...);
|
|
int (*get_val)(struct cli_obj *this);
|
|
char recvbuf[CLI_MAX_CMD_LEN + 1]; /* 命令接收缓冲区*/
|
|
unsigned short recvcnt; /* 最大接收长度*/
|
|
unsigned type : 3; /* 命令类型*/
|
|
unsigned enable : 1; /* CLI 开关控制*/
|
|
unsigned echo : 1; /* 回显设置*/
|
|
}cli_obj_t;
|
|
|
|
void cli_init(cli_obj_t *obj, const cli_port_t *p);
|
|
|
|
void cli_enable(cli_obj_t *obj);
|
|
|
|
void cli_disable (cli_obj_t *obj);
|
|
|
|
void cli_echo_ctrl (cli_obj_t *obj, int echo);
|
|
|
|
void cli_exec_cmd(cli_obj_t *obj, const char *cmd);
|
|
|
|
void cli_process(cli_obj_t *obj);
|
|
|
|
|
|
#endif /* __CMDLINE_H */
|