AT-Command/samples/linux/include/cli.h

116 lines
4.0 KiB
C
Raw Normal View History

2022-12-31 14:42:31 +00:00
/******************************************************************************
* @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 */