1.解决链表未初始化导致段错误问题。

2.调通单行命令、多行命令、自定义命令收发功能。
This commit is contained in:
魔罗技术 2021-01-20 22:17:53 +08:00
parent 0d978ff3c2
commit 84bfaa01c4
2 changed files with 169 additions and 112 deletions

238
at_chat.c
View File

@ -1,13 +1,15 @@
/******************************************************************************
* @brief ATָ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>
* @brief ATָ<EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>
*
* Copyright (c) 2020, <morro_luo@163.com>
* Copyright (c) 2020~2021, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apathe-2.0
*
* Change Logs:
* Date Author Notes
* 2020-01-02 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2021-01-20 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>debug<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>ͨ<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_chat.h"
@ -16,13 +18,17 @@
#include <stdio.h>
//<2F><>ʱ<EFBFBD>ж<EFBFBD>
#define AT_IS_TIMEOUT(start, time) (at_get_ms() - (start) > (time))
#define AT_IS_TIMEOUT(start, time) (AT_GET_TICK() - (start) > (time))
/**AT<41><54>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><><CAB5><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>) -----------------------------------*/
#define AT_TYPE_WORK 0 /* <20><>ͨ<EFBFBD><CDA8>ҵ ----------*/
#define AT_TYPE_CMD 1 /* <20><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD> ----------*/
#define AT_TYPE_MULTILINE 3 /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----------*/
#define AT_TYPE_SINGLLINE 4 /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----------*/
#define AT_TYPE_MULTILINE 2 /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----------*/
#define AT_TYPE_SINGLLINE 3 /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----------*/
#ifndef AT_DEBUG
#define AT_DEBUG(...) do {}while(0)
#endif
typedef int (*base_work)(at_obj_t *at, ...);
@ -33,9 +39,9 @@ static const inline at_adapter_t *__get_adapter(at_obj_t *at)
return &at->adap;
}
static bool is_timeout(at_obj_t *at, unsigned int ms)
static bool at_is_timeout(at_obj_t *at, unsigned int ms)
{
return AT_IS_TIMEOUT(at->resp_timer, ms);
return AT_IS_TIMEOUT(at->timer, ms);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ -85,13 +91,20 @@ static char *search_string(at_obj_t *at, const char *str)
return strstr(get_recv_buf(at), str);
}
/**ǰ<><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>*/
/**
* @brief <EFBFBD><EFBFBD>ִֹ<EFBFBD><EFBFBD>
*/
static bool at_isabort(at_obj_t *at)
{
return at->cursor ? at->cursor->abort : 1;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
static void at_reset_timer(at_obj_t *at)
{
at->timer = AT_GET_TICK();
}
/**
* @brief ATִ<EFBFBD>лص<EFBFBD>
*/
@ -110,27 +123,7 @@ static void do_at_callbatk(at_obj_t *a, at_item_t *i, at_callbatk_t cb, at_retur
}
}
/**
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param[in] cfg - AT<EFBFBD><EFBFBD>Ӧ
*/
void at_core_init(at_obj_t *at, const at_adapter_t *adap)
{
at_env_t *e;
at->adap = *adap;
e = &at->env;
at->recv_cnt = 0;
e->is_timeout = is_timeout;
e->printf = print;
e->recvbuf = get_recv_buf;
e->recvclr = recv_buf_clear;
e->recvlen = get_recv_count;
e->find = search_string;
e->abort = at_isabort;
}
/**<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
static bool add_work(at_obj_t *at, void *params, void *info, int type)
{
at_item_t *i;
@ -152,14 +145,14 @@ static bool add_work(at_obj_t *at, void *params, void *info, int type)
static int do_work_handler(at_obj_t *at)
{
at_item_t *i = at->cursor;
return ((int (*)(at_env_t *e))i->info)(i->param);
return ((int (*)(at_env_t *e))i->info)(&at->env);
}
/*******************************************************************************
* @brief ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return 0 - <EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>0 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************/
/**
* @brief ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ, false - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ,
*/
static int do_cmd_handler(at_obj_t *a)
{
at_item_t *i = a->cursor;
@ -172,28 +165,30 @@ static int do_cmd_handler(at_obj_t *a)
e->reset_timer(a);
e->recvclr(a);
break;
case 1: /*<2A><><EFBFBD><EFBFBD>״̬ -----------------------------------0-------------------*/
if (search_string(a, c->matcher)) {
case 1:
if (search_string(a, c->matcher)) { //<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
do_at_callbatk(a, i, c->cb, AT_RET_OK);
return true;
} else if (search_string(a, "ERROR")) {
} else if (search_string(a, "ERROR")) {
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
if (++e->i >= c->retry) {
do_at_callbatk(a, i, c->cb, AT_RET_ERROR);
return true;
}
e->state = 2; /* <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1>*/
e->reset_timer(a); /* <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>*/
} else if (e->is_timeout(a, c->timeout)) {
} else if (e->is_timeout(a, c->timeout)) { /* <20><>Ӧ<EFBFBD><D3A6>ʱ*/
if (++e->i >= c->retry) {
do_at_callbatk(a, i, c->cb, AT_RET_TIMEOUT);
return true;
}
e->state = 0; /**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ״̬*/
e->state = 0; /*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ״̬*/
}
break;
case 2:
if (e->is_timeout(a, 500))
e->state = 0; /**<EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ״̬*/
e->state = 0; /*<EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ״̬*/
break;
default:
e->state = 0;
@ -201,11 +196,11 @@ static int do_cmd_handler(at_obj_t *a)
return false;
}
/*******************************************************************************
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return 0 - <EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>0 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************/
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ, false - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ,
*/
static int send_signlline_handler(at_obj_t *a)
{
at_item_t *i = a->cursor;
@ -220,23 +215,25 @@ static int send_signlline_handler(at_obj_t *a)
e->reset_timer(a);
e->recvclr(a);
break;
case 1: /*<2A><><EFBFBD><EFBFBD>״̬ -------------------------------------------------------*/
if (search_string(a, "OK")) {
do_at_callbatk(a, i, cb, AT_RET_OK);
case 1:
if (search_string(a, "OK")) {
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
do_at_callbatk(a, i, cb, AT_RET_OK); //<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
return true;
} else if (search_string(a, "ERROR")) {
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
if (++e->i >= 3) {
do_at_callbatk(a, i, cb, AT_RET_ERROR);
return true;
}
e->state = 2; /**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>*/
e->reset_timer(a); /**<EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>*/
e->state = 2; /*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>*/
e->reset_timer(a); /*<EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>*/
} else if (e->is_timeout(a, 3000 + e->i * 2000)) {
if (++e->i >= 3) {
do_at_callbatk(a, i, cb, AT_RET_TIMEOUT);
return true;
}
e->state = 0; /**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ״̬*/
e->state = 0; /*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ״̬*/
}
break;
case 2:
@ -248,11 +245,12 @@ static int send_signlline_handler(at_obj_t *a)
}
return false;
}
/*******************************************************************************
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return 0 - <EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>0 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************/
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ, false - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ,
*/
static int send_multiline_handler(at_obj_t *a)
{
at_item_t *i = a->cursor;
@ -271,22 +269,28 @@ static int send_multiline_handler(at_obj_t *a)
e->state++;
break;
case 1:
if (search_string(a, "OK")){
if (search_string(a, "OK")) {
e->state = 0;
e->i++;
e->i = 0;
e->j = 0;
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
} else if (search_string(a, "ERROR")) {
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
if (++e->j >= 3) {
do_at_callbatk(a, i, cb, AT_RET_ERROR);
return true;
}
e->state = 2; /**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>*/
e->reset_timer(a); /**<EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>*/
e->state = 2; /*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>*/
e->reset_timer(a); /*<EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>*/
} else if (e->is_timeout(a, 3000)) {
do_at_callbatk(a, i, cb, AT_RET_TIMEOUT);
return true;
}
break;
case 2:
if (e->is_timeout(a, 500))
e->state = 0; /**<2A><><EFBFBD>س<EFBFBD>ʼ״̬*/
break;
default:
e->state = 0;
}
@ -296,7 +300,7 @@ static int send_multiline_handler(at_obj_t *a)
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] fmt - <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] args - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
* @param[in] args - <EFBFBD>ɱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
*/
static void at_send_line(at_obj_t *at, const char *fmt, va_list args)
{
@ -308,21 +312,29 @@ static void at_send_line(at_obj_t *at, const char *fmt, va_list args)
recv_buf_clear(at); //<2F><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD>
send_data(at, buf, len);
send_data(at, "\r\n", 2);
AT_DEBUG("->\r\n%s\r\n", buf);
}
/**
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] urc
* @brief urc(unsolicited code) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] urc - <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] size - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
* @return none
*/
static void urc_handler_entry(at_obj_t *at, char *urc, unsigned int size)
{
int i, n;
utc_item_t *tbl = at->adap.utc_tbl;
for (i = 0; i < at->adap.urc_tbl_count; i++){
n = strlen(tbl->prefix);
if (strncmp(urc, tbl->prefix, n) == 0)
tbl[i].handler(urc, size);
for (i = 0; i < at->adap.urc_tbl_count; i++) {
n = strlen(tbl->prefix);
if (strncmp(urc, tbl->prefix, n) == 0) { /* ƥ<><C6A5>ǰ׺ */
tbl[i].handler(urc, size); /* <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>*/
break;
}
}
if (at->cursor == NULL)
AT_DEBUG("<=\r\n%s\r\n", urc);
}
/**
@ -335,22 +347,24 @@ static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size)
char *urc_buf;
unsigned short urc_size;
urc_buf = (char *)at->adap.urc_buf;
urc_size = at->adap.urc_bufsize;
urc_size = at->adap.urc_bufsize;
if (size == 0 && at->urc_cnt > 0) {
if (AT_IS_TIMEOUT(at->urc_timer, 2000)){
if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* <20><><EFBFBD>ճ<EFBFBD>ʱ*/
urc_handler_entry(at, urc_buf, at->urc_cnt);
at->recv_cnt = 0;
AT_DEBUG("Urc recv timeout.\r\n");
}
} else {
at->urc_timer = at_get_ms();
} else if (urc_buf != NULL){
at->urc_timer = AT_GET_TICK();
while (size--) {
if (*buf == '\n') {
if (*buf == '\n') { /*<2A><><EFBFBD>д<EFBFBD><D0B4><EFBFBD>*/
urc_buf[at->urc_cnt] = '\0';
urc_handler_entry(at, urc_buf, at->urc_cnt);
} else {
urc_buf[at->urc_cnt++] = *buf++;
if (at->urc_cnt >= urc_size)
at->urc_cnt = 0;
if (at->urc_cnt >= urc_size) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
at->urc_cnt = 0;
}
}
}
@ -371,14 +385,46 @@ static void resp_recv_process(at_obj_t *at, const char *buf, unsigned int size)
if (at->recv_cnt + size >= recv_size) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
at->recv_cnt = 0;
memcpy(recv_buf + at->recv_cnt, buf, size);
memcpy(recv_buf + at->recv_cnt, buf, size);
at->recv_cnt += size;
recv_buf[at->recv_cnt] = '\0';
}
/**
* @brief ִ<EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param[in] at - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] adap - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void at_obj_init(at_obj_t *at, const at_adapter_t *adap)
{
int i;
at_env_t *e;
at->adap = *adap;
e = &at->env;
at->recv_cnt = 0;
e->is_timeout = at_is_timeout;
e->printf = print;
e->recvbuf = get_recv_buf;
e->recvclr = recv_buf_clear;
e->recvlen = get_recv_count;
e->find = search_string;
e->abort = at_isabort;
e->reset_timer = at_reset_timer;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>*/
INIT_LIST_HEAD(&at->ls_idle);
INIT_LIST_HEAD(&at->ls_ready);
for (i = 0; i < sizeof(at->items) / sizeof(at_item_t); i++)
list_add_tail(&at->items[i].node, &at->ls_idle);
while (adap->recv_buf == NULL) {} //ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ǿ<EFBFBD>
}
/**
* @brief ִ<EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ(<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ)
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] work - AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] params -
*/
@ -389,7 +435,7 @@ bool at_do_work(at_obj_t *at, int (*work)(at_env_t *e), void *params)
/**
* @brief ִ<EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD>
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] cmd - cmd<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
bool at_do_cmd(at_obj_t *at, void *params, const at_cmd_t *cmd)
@ -398,8 +444,8 @@ bool at_do_cmd(at_obj_t *at, void *params, const at_cmd_t *cmd)
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] at - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Ĭ<EFBFBD>ϵȴ<EFBFBD>OK<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 3s<EFBFBD><EFBFBD>ʱ)
* @param[in] at - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] cb - ִ<EFBFBD>лص<EFBFBD>
* @param[in] singlline - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ,singlline<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
@ -410,8 +456,8 @@ bool at_send_singlline(at_obj_t *at, at_callbatk_t cb, const char *singlline)
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] at - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>, Ĭ<EFBFBD>ϵȴ<EFBFBD>OK<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 3s<EFBFBD><EFBFBD>ʱ)
* @param[in] at - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] cb - ִ<EFBFBD>лص<EFBFBD>
* @param[in] multiline - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ,multiline
@ -422,7 +468,7 @@ bool at_send_multiline(at_obj_t *at, at_callbatk_t cb, const char **multiline)
}
/**
* @brief ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹAT<EFBFBD><EFBFBD>ҵ
* @brief ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹAT<EFBFBD><EFBFBD>ҵ
*/
void at_item_abort(at_item_t *i)
@ -431,10 +477,10 @@ void at_item_abort(at_item_t *i)
}
/**
* @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_core_busy(at_obj_t *at)
bool at_obj_busy(at_obj_t *at)
{
return !list_empty(&at->ls_ready);
}
@ -444,14 +490,13 @@ bool at_core_busy(at_obj_t *at)
*/
static void at_work_manager(at_obj_t *at)
{
register at_item_t *cursor = at->cursor;
at_env_t *e = &at->env;
/*ͨ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---------------------------------------------------------*/
/*<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
static int (*const work_handler_table[])(at_obj_t *) = {
do_work_handler,
do_cmd_handler,
send_signlline_handler,
send_multiline_handler
send_multiline_handler,
send_signlline_handler
};
if (at->cursor == NULL) {
if (list_empty(&at->ls_ready)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
@ -459,17 +504,18 @@ static void at_work_manager(at_obj_t *at)
e->i = 0;
e->j = 0;
e->state = 0;
e->params = cursor->param;
e->recvclr(at);
e->reset_timer(at);
at->cursor = list_first_entry(&at->ls_ready, at_item_t, node);
e->params = at->cursor->param;
e->recvclr(at);
e->reset_timer(at);
}
/**<2A><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB5BD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD> ------------------------------------*/
if (work_handler_table[cursor->type](at) || cursor->abort) {
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB5BD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD> -------------------------------------*/
if (work_handler_table[at->cursor->type](at) || at->cursor->abort) {
list_move_tail(&at->cursor->node, &at->ls_idle);
at->cursor = NULL;
}
}
/**
* @brief AT<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/

View File

@ -1,24 +1,35 @@
/******************************************************************************
* @brief ATָ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>
* @brief ATָ<EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>
*
* Copyright (c) 2020, <morro_luo@163.com>
* Copyright (c) 2020~2021, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apathe-2.0
*
* Change Logs:
* Date Author Notes
* 2020-01-02 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2021-01-20 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>debug<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>ͨ<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 _ATCHAT_H_
#define _ATCHAT_H_
#include "at_util.h"
#include <list.h>
#include <stdbool.h>
/*<2A><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD><EEB3A4> --------------------------------------------------------------*/
#define MAX_AT_CMD_LEN 128
/* debug <20><>ӡ<EFBFBD>ӿ<EFBFBD> ------------------------------------------------------------*/
#include <stdio.h>
#define AT_DEBUG(...) printf("[AT]:");printf(__VA_ARGS__) /*do{}while(0)*/
/* <20><>ȡϵͳ<CFB5>δ<EFBFBD>(ms) -----------------------------------------------------------*/
#include "platform.h"
#define AT_GET_TICK() get_tick()
struct at_obj;
/*urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
@ -81,24 +92,24 @@ typedef enum {
/*AT<41><54>ҵ<EFBFBD><D2B5>*/
typedef struct {
at_work_state state : 3;
unsigned char type : 3;
unsigned char abort : 1;
void *param;
void *info;
struct list_head node;
unsigned int state : 3;
unsigned int type : 3; /* <20><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>*/
unsigned int abort : 1;
void *param; /* ͨ<>ò<EFBFBD><C3B2><EFBFBD>*/
void *info; /* ͨ<><CDA8><EFBFBD><EFBFBD>Ϣָ<CFA2><D6B8>*/
struct list_head node; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
}at_item_t;
/*AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------------------------------------------------------*/
typedef struct at_obj{
at_adapter_t adap;
at_env_t env;
at_item_t tbl[10];
at_item_t *cursor;
struct list_head ls_ready, ls_idle; /*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>*/
unsigned int resp_timer;
unsigned int urc_timer;
at_return ret;
at_env_t env; /* <20><>ҵ<EFBFBD><D2B5><EFBFBD>л<EFBFBD><D0BB><EFBFBD>*/
at_item_t items[10]; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD>ҵ*/
at_item_t *cursor; /* <20><>ǰ<EFBFBD><C7B0>ҵ<EFBFBD><D2B5>*/
struct list_head ls_ready, ls_idle; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>*/
unsigned int timer;
unsigned int urc_timer; /* urc<72><63><EFBFBD>ռ<EFBFBD>ʱ<EFBFBD><CAB1>*/
at_return ret;
//urc<72><63><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
unsigned short urc_cnt, recv_cnt;
unsigned char suspend: 1;