AT-Command/at.h
魔罗技术 ea3dccb6b6 1.支持URC回调中接收数据.
2.修改struct at_obj,去除链表管理机制,使用单独任务接收处理每个at_obj.
2021-02-19 22:21:05 +08:00

158 lines
5.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
* @brief AT<41><54><EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>(OS<4F>汾)
*
* Copyright (c) 2020, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2020-01-02 Morro Initial version.
* 2021-02-01 Morro ֧<><D6A7>URC<52>ص<EFBFBD><D8B5>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* 2021-02-05 Morro 1.<2E>޸<EFBFBD>struct at_obj,ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2.ɾ<><C9BE> at_obj_destroy<6F>ӿ<EFBFBD>
******************************************************************************/
#ifndef _AT_H_
#define _AT_H_
#include "at_util.h"
#include <stdbool.h>
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4> */
#define MAX_AT_CMD_LEN 128
/* <20><><EFBFBD><EFBFBD>urc<72><63><EFBFBD>ճ<EFBFBD>ʱʱ<CAB1><CAB1>*/
#define MAX_URC_RECV_TIMEOUT 300
/* ָ<><D6B8><EFBFBD><EFBFBD>URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> */
#define SPEC_URC_END_MARKS ",\r\n"
struct at_obj; /* AT<41><54><EFBFBD><EFBFBD>*/
/*AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6> ---------------------------------------------------------------*/
typedef enum {
AT_RET_OK = 0, /* ִ<>гɹ<D0B3>*/
AT_RET_ERROR, /* ִ<>д<EFBFBD><D0B4><EFBFBD>*/
AT_RET_TIMEOUT, /* <20><>Ӧ<EFBFBD><D3A6>ʱ*/
AT_RET_ABORT, /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>*/
}at_return;
/**
* @brief URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Context) <20><><EFBFBD><EFBFBD>
*/
typedef struct {
/**
* @brief <20><><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>ӿ<EFBFBD>
* @params buf - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @params len - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
*/
unsigned int (*read)(void *buf, unsigned int len);
char *buf; /* <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> */
int bufsize; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С */
int recvlen; /* <20>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>*/
} at_urc_ctx_t;
/*(Unsolicited Result Codes (URCs))<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------------------------*/
typedef struct {
/**
* @brief urc ǰ׺(<28><>"+CSQ: ")
*/
const char *prefix;
/**
* @brief urc ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>(<28>ο<EFBFBD>DEF_URC_END_MARKS<4B>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>"\n")
* @note
*/
const char *end_mark;
/**
* @brief urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @params ctx - URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void (*handler)(at_urc_ctx_t *ctx);
}utc_item_t;
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
typedef struct {
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
unsigned int (*write)(const void *buf, unsigned int len);
//<2F><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD>
unsigned int (*read)(void *buf, unsigned int len);
//<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
void (*debug)(const char *fmt, ...);
//utc <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
utc_item_t *utc_tbl;
//urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
char *urc_buf;
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
unsigned short urc_tbl_count;
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
unsigned short urc_bufsize;
}at_adapter_t;
/*AT<41><54>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
typedef struct {
const char *matcher; /* <20><><EFBFBD><EFBFBD>ƥ<EFBFBD>䴮 */
char *recvbuf; /* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */
unsigned short bufsize; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
unsigned int timeout; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1> */
}at_respond_t;
/** work context ------------------------------------------------------------*/
/**
* @brief AT<41><54>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Work Context) <20><><EFBFBD><EFBFBD>
*/
typedef struct at_work_ctx {
//<2F><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>,<2C><>at_do_work<72>ӿڴ<D3BF><DAB4><EFBFBD>
void *params;
unsigned int (*write)(const void *buf, unsigned int len);
unsigned int (*read)(void *buf, unsigned int len);
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
void (*printf)(struct at_work_ctx *self, const char *fmt, ...);
//<2F><>Ӧ<EFBFBD>ȴ<EFBFBD>
at_return (*wait_resp)(struct at_work_ctx *self, const char *prefix,
unsigned int timeout);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
void (*recvclr)(struct at_work_ctx *self);
}at_work_ctx_t;
/*AT<41><54><EFBFBD><EFBFBD> ---------------------------------------------------------------------*/
typedef struct at_obj {
at_adapter_t adap; /* <20>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
at_work_ctx_t ctx; /* work context*/
at_sem_t cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
at_sem_t completed; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>*/
at_respond_t *resp; /* ATӦ<54><D3A6><EFBFBD><EFBFBD>Ϣ*/
unsigned int resp_timer; /* <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>*/
unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */
at_return ret; /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>*/
//urc<72><63><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
unsigned short urc_cnt, rcv_cnt;
unsigned char busy : 1;
unsigned char suspend: 1;
unsigned char dowork : 1;
}at_obj_t;
typedef at_return (*at_work)(at_work_ctx_t *);
void at_obj_create(at_obj_t *at, const at_adapter_t *adap); /* AT<41><54>ʼ<EFBFBD><CABC>*/
void at_obj_destroy(at_obj_t *at);
bool at_obj_busy(at_obj_t *at);
void at_suspend(at_obj_t *at); /* <20><><EFBFBD><EFBFBD>*/
void at_resume(at_obj_t *at); /* <20>ָ<EFBFBD>*/
at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd);
//<2F><>Ӧ<EFBFBD>зָ<D6B8><EEB4A6>
int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separator);
at_return at_do_work(at_obj_t *at, at_work work, void *params);/* <20>Զ<EFBFBD><D4B6><EFBFBD>AT<41><54>ҵ*/
void at_process(at_obj_t *at); /* AT<41><54><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>*/
#endif