mirror of
https://gitee.com/moluo-tech/AT-Command.git
synced 2025-02-05 17:28:23 +08:00
1.删除at_obj中的at_work_ctx_t域,减少内存使用
2.解决重复释放信号量导致命令出现等待超时的问题
This commit is contained in:
parent
44cd306a95
commit
8f56581724
252
at.c
252
at.c
@ -1,17 +1,21 @@
|
||||
/******************************************************************************
|
||||
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>(OS<EFBFBD>汾)
|
||||
*
|
||||
* 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 ֧<EFBFBD><EFBFBD>URC<EFBFBD>ص<EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
* 2021-02-05 Morro 1.<EFBFBD><EFBFBD>struct at_obj,ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<EFBFBD>ӿ<EFBFBD>
|
||||
******************************************************************************/
|
||||
/**
|
||||
******************************************************************************
|
||||
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>(OS<EFBFBD>汾)
|
||||
*
|
||||
* 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 ֧<EFBFBD><EFBFBD>URC<EFBFBD>ص<EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
* 2021-02-05 Morro 1.<EFBFBD><EFBFBD>struct at_obj,ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<EFBFBD>ӿ<EFBFBD>
|
||||
* 2021-03-21 Morro ɾ<EFBFBD><EFBFBD>at_obj<EFBFBD>е<EFBFBD>at_work_ctx_t<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||
* 2021-04-08 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "at.h"
|
||||
#include "comdef.h"
|
||||
#include <stdarg.h>
|
||||
@ -19,26 +23,15 @@
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
|
||||
//<2F><>ʱ<EFBFBD>ж<EFBFBD>
|
||||
#define AT_IS_TIMEOUT(start, time) (at_get_ms() - (start) > (time))
|
||||
|
||||
/*
|
||||
* @brief Ĭ<EFBFBD>ϵ<EFBFBD><EFBFBD>Խӿ<EFBFBD>
|
||||
*/
|
||||
/**
|
||||
* @brief Ĭ<EFBFBD>ϵ<EFBFBD><EFBFBD>Խӿ<EFBFBD>
|
||||
*/
|
||||
static void nop_dbg(const char *fmt, ...){}
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD>ȡat<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
at_obj_t *get_at_obj(struct at_work_ctx *e)
|
||||
{
|
||||
return container_of(e, at_obj_t, ctx);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
static void put_string(at_obj_t *at, const char *s)
|
||||
{
|
||||
while (*s != '\0')
|
||||
@ -46,9 +39,9 @@ static void put_string(at_obj_t *at, const char *s)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
*/
|
||||
static void put_line(at_obj_t *at, const char *s)
|
||||
{
|
||||
put_string(at, s);
|
||||
@ -63,43 +56,42 @@ static void at_print(struct at_work_ctx *e, const char *cmd, ...)
|
||||
va_start(args, cmd);
|
||||
char buf[MAX_AT_CMD_LEN];
|
||||
vsnprintf(buf, sizeof(buf), cmd, args);
|
||||
put_line(get_at_obj(e), buf);
|
||||
put_line(e->at, buf);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
static void recvbuf_clr(struct at_work_ctx *e)
|
||||
{
|
||||
get_at_obj(e)->rcv_cnt = 0;
|
||||
e->at->rcv_cnt = 0;
|
||||
}
|
||||
|
||||
//<2F>ȴ<EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
||||
static at_return wait_resp(at_obj_t *at, at_respond_t *r)
|
||||
{
|
||||
at->resp = r;
|
||||
{
|
||||
at->ret = AT_RET_TIMEOUT;
|
||||
at->resp_timer = at_get_ms();
|
||||
at->rcv_cnt = 0; //<2F><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
at->resp = r;
|
||||
at_sem_wait(at->completed, r->timeout);
|
||||
at->adap.debug("<-\r\n%s\r\n", r->recvbuf);
|
||||
at->resp = NULL;
|
||||
return at->ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦAT<EFBFBD><EFBFBD>Ӧ
|
||||
* @param[in] resp - <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD>(<EFBFBD><EFBFBD>"OK",">")
|
||||
* @param[in] timeout - <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
|
||||
*/
|
||||
at_return wait_resp_sync(struct at_work_ctx *e, const char *resp,
|
||||
unsigned int timeout)
|
||||
/**
|
||||
* @brief <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] resp - <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD>(<EFBFBD><EFBFBD>"OK",">")
|
||||
* @param[in] timeout - <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
|
||||
*/
|
||||
at_return wait_recv(struct at_work_ctx *e, const char *resp,
|
||||
unsigned int timeout)
|
||||
{
|
||||
char buf[64];
|
||||
int cnt = 0, len;
|
||||
at_obj_t *at = get_at_obj(e);
|
||||
|
||||
at_obj_t *at = e->at;
|
||||
at_return ret = AT_RET_TIMEOUT;
|
||||
unsigned int timer = at_get_ms();
|
||||
while (at_get_ms() - timer < timeout) {
|
||||
@ -119,36 +111,29 @@ at_return wait_resp_sync(struct at_work_ctx *e, const char *resp,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
void at_obj_create(at_obj_t *at, const at_adapter_t *adap)
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] adap - AT<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
void at_obj_init(at_obj_t *at, const at_adapter_t *adap)
|
||||
{
|
||||
at_work_ctx_t *ctx;
|
||||
at->adap = *adap;
|
||||
at->rcv_cnt = 0;
|
||||
|
||||
at->cmd_lock = ril_sem_new(1);
|
||||
at->completed = ril_sem_new(0);
|
||||
ctx = &at->ctx;
|
||||
ctx->printf = at_print;
|
||||
ctx->recvclr = recvbuf_clr;
|
||||
ctx->read = adap->read;
|
||||
ctx->write = adap->write;
|
||||
ctx->wait_resp = wait_resp_sync;
|
||||
|
||||
|
||||
if (at->adap.debug == NULL)
|
||||
at->adap.debug = nop_dbg;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] fmt - <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] r - <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL, Ĭ<EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD>OK<EFBFBD><EFBFBD>ʾ<EFBFBD>ɹ<EFBFBD>,<EFBFBD>ȴ<EFBFBD>5s
|
||||
* @param[in] args - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
*/
|
||||
/**
|
||||
* @brief ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] fmt - <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] r - <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL, Ĭ<EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD>OK<EFBFBD><EFBFBD>ʾ<EFBFBD>ɹ<EFBFBD>,<EFBFBD>ȴ<EFBFBD>5s
|
||||
* @param[in] args - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
*/
|
||||
at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd)
|
||||
{
|
||||
at_return ret;
|
||||
@ -172,38 +157,48 @@ at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief ִ<EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
||||
* @param[in] urc
|
||||
* @return none
|
||||
*/
|
||||
at_return at_do_work(at_obj_t *at, at_work work, void *params)
|
||||
/**
|
||||
* @brief ִ<EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
||||
* @param[in] at - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] work - <EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> - int (*)(at_work_ctx_t *))
|
||||
* @param[in] params- <EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>work<EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
*/
|
||||
int at_do_work(at_obj_t *at, at_work work, void *params)
|
||||
{
|
||||
at_return ret;
|
||||
if (!at_sem_wait(at->cmd_lock, 150 * 1000)) {
|
||||
at_work_ctx_t ctx;
|
||||
int ret;
|
||||
if (!at_sem_wait(at->cmd_lock, 150 * 1000)) {
|
||||
return AT_RET_TIMEOUT;
|
||||
}
|
||||
at->busy = true;
|
||||
while (at->urc_cnt) { //<2F>ȴ<EFBFBD>URC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
at_delay(1);
|
||||
}
|
||||
at->ctx.params = params;
|
||||
//<2F><><EFBFBD><EFBFBD>at_work_ctx_t
|
||||
ctx.params = params;
|
||||
ctx.printf = at_print;
|
||||
ctx.recvclr = recvbuf_clr;
|
||||
ctx.read = at->adap.read;
|
||||
ctx.write = at->adap.write;
|
||||
ctx.wait_resp = wait_recv;
|
||||
ctx.at = at;
|
||||
at->dowork = true;
|
||||
at->rcv_cnt = 0;
|
||||
ret = work(&at->ctx);
|
||||
ret = work(&ctx);
|
||||
at->dowork = false;
|
||||
at_sem_post(at->cmd_lock);
|
||||
at->busy = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>
|
||||
* @param[in] recvbuf - <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[out] lines - <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] separator- <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>(, \n)
|
||||
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>
|
||||
* @param[in] recvbuf - <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[out] lines - <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] separator- <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>(, \n)
|
||||
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separator)
|
||||
{
|
||||
char *s = recvbuf;
|
||||
@ -222,11 +217,11 @@ int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separat
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] urcline - URC<EFBFBD><EFBFBD>
|
||||
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, false - δʶ<EFBFBD><EFBFBD>URC
|
||||
*/
|
||||
/**
|
||||
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] urcline - URC<EFBFBD><EFBFBD>
|
||||
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, false - δʶ<EFBFBD><EFBFBD>URC
|
||||
*/
|
||||
static bool urc_handler_entry(at_obj_t *at, char *urcline, unsigned int size)
|
||||
{
|
||||
int i;
|
||||
@ -257,11 +252,11 @@ static bool urc_handler_entry(at_obj_t *at, char *urcline, unsigned int size)
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief urc <EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] ch - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
||||
* @return none
|
||||
*/
|
||||
/**
|
||||
* @brief urc <EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] ch - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
||||
* @return none
|
||||
*/
|
||||
static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
||||
{
|
||||
register char *urc_buf;
|
||||
@ -269,10 +264,11 @@ static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
||||
urc_buf = at->adap.urc_buf;
|
||||
|
||||
//<2F><><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>,Ĭ<><C4AC>MAX_URC_RECV_TIMEOUT
|
||||
if (at->urc_cnt > 0 && AT_IS_TIMEOUT(at->urc_timer, MAX_URC_RECV_TIMEOUT)) {
|
||||
if (at->urc_cnt > 0 && at_istimeout(at->urc_timer, MAX_URC_RECV_TIMEOUT)) {
|
||||
urc_buf[at->urc_cnt] = '\0';
|
||||
at->urc_cnt = 0;
|
||||
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
|
||||
if (at->urc_cnt > 2)
|
||||
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
|
||||
}
|
||||
|
||||
while (size--) {
|
||||
@ -297,22 +293,22 @@ static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ֪ͨ
|
||||
* @return none
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ֪ͨ
|
||||
* @return none
|
||||
*/
|
||||
static void resp_notification(at_obj_t *at, at_return ret)
|
||||
{
|
||||
at->ret = ret;
|
||||
at_sem_post(at->completed);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] buf - <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] size - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return none
|
||||
*/
|
||||
/**
|
||||
* @brief ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] buf - <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] size - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return none
|
||||
*/
|
||||
static void resp_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
||||
{
|
||||
char *rcv_buf;
|
||||
@ -337,49 +333,51 @@ static void resp_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
||||
|
||||
if (strstr(rcv_buf, resp->matcher)) { //<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
||||
resp_notification(at, AT_RET_OK);
|
||||
return;
|
||||
} else if (strstr(rcv_buf, "ERROR")) {
|
||||
resp_notification(at, AT_RET_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (AT_IS_TIMEOUT(at->resp_timer, resp->timeout)) //<2F><><EFBFBD>ճ<EFBFBD>ʱ
|
||||
resp_notification(at, AT_RET_TIMEOUT);
|
||||
if (at_istimeout(at->resp_timer, resp->timeout)) //<2F><><EFBFBD>ճ<EFBFBD>ʱ
|
||||
resp_notification(at, AT_RET_TIMEOUT);
|
||||
else if (at->suspend) //ǿ<><C7BF><EFBFBD><EFBFBD>ֹ
|
||||
resp_notification(at, AT_RET_ABORT);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief ATæ<EFBFBD>ж<EFBFBD>
|
||||
* @return true - <EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
/**
|
||||
* @brief ATæ<EFBFBD>ж<EFBFBD>
|
||||
* @return true - <EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
bool at_obj_busy(at_obj_t *at)
|
||||
{
|
||||
return !at->busy && AT_IS_TIMEOUT(at->urc_timer, 2000);
|
||||
return !at->busy && at_istimeout(at->urc_timer, 2000);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
||||
* @return none
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
||||
* @return none
|
||||
*/
|
||||
void at_suspend(at_obj_t *at)
|
||||
{
|
||||
at->suspend = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief <EFBFBD>ָ<EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
||||
* @return none
|
||||
*/
|
||||
/**
|
||||
* @brief <EFBFBD>ָ<EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
||||
* @return none
|
||||
*/
|
||||
void at_resume(at_obj_t *at)
|
||||
{
|
||||
at->suspend = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return none
|
||||
*/
|
||||
/**
|
||||
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return none
|
||||
*/
|
||||
void at_process(at_obj_t *at)
|
||||
{
|
||||
char c;
|
||||
|
28
at.h
28
at.h
@ -11,6 +11,8 @@
|
||||
* 2021-02-01 Morro ֧<EFBFBD><EFBFBD>URC<EFBFBD>ص<EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
* 2021-02-05 Morro 1.<EFBFBD><EFBFBD>struct at_obj,ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<EFBFBD>ӿ<EFBFBD>
|
||||
* 2021-03-21 Morro ɾ<EFBFBD><EFBFBD>at_obj<EFBFBD>е<EFBFBD>at_work_ctx_t<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||
* 2021-04-08 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef _AT_H_
|
||||
@ -102,14 +104,23 @@ typedef struct {
|
||||
* @brief AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Work Context) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
typedef struct at_work_ctx {
|
||||
struct at_obj *at;
|
||||
//<2F><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>,<2C><>at_do_work<72>ӿڴ<D3BF><DAB4><EFBFBD>
|
||||
void *params;
|
||||
void *params;
|
||||
|
||||
unsigned int (*write)(const void *buf, unsigned int len);
|
||||
|
||||
unsigned int (*read)(void *buf, unsigned int len);
|
||||
|
||||
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
void (*printf)(struct at_work_ctx *self, const char *fmt, ...);
|
||||
//<2F><>Ӧ<EFBFBD>ȴ<EFBFBD>
|
||||
/*
|
||||
* @brief <EFBFBD>ȴ<EFBFBD><EFBFBD>ظ<EFBFBD>
|
||||
* @param[in] prefix - <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ(<EFBFBD><EFBFBD>"OK",">")
|
||||
* @param[in] timeout - <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>ʱʱ<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>
|
||||
@ -119,25 +130,21 @@ typedef struct at_work_ctx {
|
||||
/*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 *);
|
||||
typedef int (*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);
|
||||
void at_obj_init(at_obj_t *at, const at_adapter_t *adap); /* AT<41><54>ʼ<EFBFBD><CABC>*/
|
||||
|
||||
bool at_obj_busy(at_obj_t *at);
|
||||
|
||||
@ -147,10 +154,9 @@ void at_resume(at_obj_t *at); /*
|
||||
|
||||
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>ҵ*/
|
||||
int 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>*/
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user