优化URC匹配逻辑,并修正描述信息。

This commit is contained in:
魔罗技术 2021-05-15 15:37:00 +08:00
parent 463baf0f5c
commit 76d13e373b
2 changed files with 50 additions and 47 deletions

87
at.c
View File

@ -14,6 +14,7 @@
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<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-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> * 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>
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
****************************************************************************** ******************************************************************************
*/ */
#include "at.h" #include "at.h"
@ -122,7 +123,7 @@ void at_obj_init(at_obj_t *at, const at_adapter_t *adap)
at->cmd_lock = ril_sem_new(1); at->cmd_lock = ril_sem_new(1);
at->completed = ril_sem_new(0); at->completed = ril_sem_new(0);
at->urc_item = NULL;
if (at->adap.debug == NULL) if (at->adap.debug == NULL)
at->adap.debug = nop_dbg; at->adap.debug = nop_dbg;
@ -216,40 +217,34 @@ int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separat
} }
return i; return i;
} }
/**
* @brief <EFBFBD><EFBFBD>URC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ѯURC<EFBFBD><EFBFBD>
* @param[in] urcline - URC<EFBFBD><EFBFBD>
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD>𲢴<EFBFBD><EFBFBD><EFBFBD>, false - δʶ<EFBFBD><EFBFBD>URC
*/
const urc_item_t *find_urc_item(at_obj_t *at, char *urc_buf, unsigned int size)
{
const urc_item_t *tbl = at->adap.utc_tbl;
int i;
if (size < 2)
return NULL;
for (i = 0; i < at->adap.urc_tbl_count; i++) {
if (strstr(urc_buf, tbl->prefix))
return tbl;
tbl++;
}
return NULL;
}
/** /**
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] urcline - URC<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) static void urc_handler_entry(at_obj_t *at, char *urcline, unsigned int size)
{ {
int i;
int ch = urcline[size - 1];
at_urc_ctx_t context = {at->adap.read, urcline, at->adap.urc_bufsize, size}; at_urc_ctx_t context = {at->adap.read, urcline, at->adap.urc_bufsize, size};
at->adap.debug("<=\r\n%s\r\n", urcline);
const utc_item_t *tbl = at->adap.utc_tbl; at->urc_item->handler(&context); /* <20>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ϲ<CFB2><E3B4A6> */
if (tbl == NULL)
return true;
for (i = 0; i < at->adap.urc_tbl_count; i++) {
if (strstr(urcline, tbl->prefix)) { /* ƥ<><C6A5>ǰ׺*/
if (tbl->end_mark) { /* ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
if (!strchr(tbl->end_mark, ch))
return false;
} else if (!(ch == '\r' || ch == '\n'|| ch == '\0'))
return false;
at->adap.debug("<=\r\n%s\r\n", urcline);
tbl->handler(&context); /* <20>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ϲ<CFB2><E3B4A6> */
return true;
}
tbl++;
}
return false;
} }
/** /**
@ -266,30 +261,36 @@ static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size)
//<2F><><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><><C4AC>MAX_URC_RECV_TIMEOUT //<2F><><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><><C4AC>MAX_URC_RECV_TIMEOUT
if (at->urc_cnt > 0 && at_istimeout(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'; urc_buf[at->urc_cnt] = '\0';
at->urc_cnt = 0; at->urc_cnt = 0;
at->urc_item = NULL;
if (at->urc_cnt > 2) if (at->urc_cnt > 2)
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf); at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
} }
while (size--) { while (size--) {
at->urc_timer = at_get_ms(); at->urc_timer = at_get_ms();
ch = *buf++; ch = *buf++;
urc_buf[at->urc_cnt++] = ch; urc_buf[at->urc_cnt++] = ch;
if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
urc_buf[at->urc_cnt] = '\0'; urc_buf[at->urc_cnt] = '\0';
if (at->urc_item == NULL)
if (ch == '\r' || ch == '\n'|| ch == '\0') { //<2F><><EFBFBD>⵽1<E2B5BD><31>URC at->urc_item = find_urc_item(at, urc_buf, at->urc_cnt);
if (at->urc_cnt > 2) { if (at->urc_item != NULL){
if (!urc_handler_entry(at, urc_buf, at->urc_cnt) && !at->busy) if (strchr(at->urc_item->end_mark, ch)) { //ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
at->adap.debug("%s\r\n", urc_buf); //δʶ<CEB4>𵽵<EFBFBD>URC urc_handler_entry(at, urc_buf, at->urc_cnt);
at->urc_cnt = 0;
at->urc_item = NULL;
} }
at->urc_cnt = 0; } else if (ch == '\r' || ch == '\n'|| ch == '\0') {
} else if (urc_handler_entry(at, urc_buf, at->urc_cnt)) { if (at->urc_cnt > 2 && !at->busy) {
at->urc_cnt = 0; at->adap.debug("%s\r\n", urc_buf); //δʶ<CEB4>𵽵<EFBFBD>URC
}
at->urc_cnt = 0;
} }
} else if (at->urc_cnt >= at->adap.urc_bufsize) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } else if (at->urc_cnt >= at->adap.urc_bufsize) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
at->urc_cnt = 0; at->urc_cnt = 0;
at->urc_item = NULL;
}
} }
} }

10
at.h
View File

@ -13,6 +13,7 @@
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<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-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> * 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>
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************/ ******************************************************************************/
#ifndef _AT_H_ #ifndef _AT_H_
@ -28,7 +29,7 @@
#define MAX_URC_RECV_TIMEOUT 300 #define MAX_URC_RECV_TIMEOUT 300
/* ָ<><D6B8><EFBFBD><EFBFBD>URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> */ /* ָ<><D6B8><EFBFBD><EFBFBD>URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> */
#define SPEC_URC_END_MARKS ",\r\n" #define SPEC_URC_END_MARKS ":,\r\n"
struct at_obj; /* AT<41><54><EFBFBD><EFBFBD>*/ struct at_obj; /* AT<41><54><EFBFBD><EFBFBD>*/
@ -71,7 +72,7 @@ typedef struct {
* @params ctx - URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @params ctx - URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/ */
void (*handler)(at_urc_ctx_t *ctx); void (*handler)(at_urc_ctx_t *ctx);
}utc_item_t; }urc_item_t;
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/ /**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
typedef struct { typedef struct {
@ -82,7 +83,7 @@ typedef struct {
//<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL //<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
void (*debug)(const char *fmt, ...); 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 <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_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 //urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
char *urc_buf; char *urc_buf;
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0 //urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
@ -133,10 +134,11 @@ typedef struct at_obj {
at_sem_t cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ at_sem_t cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
at_sem_t completed; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>Ϣ*/ at_respond_t *resp; /* ATӦ<54><D3A6><EFBFBD><EFBFBD>Ϣ*/
const urc_item_t *urc_item; /* <20><>ǰURC<52><43>*/
unsigned int resp_timer; /* <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>*/ unsigned int resp_timer; /* <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>*/
unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */ unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */
at_return ret; /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>*/ at_return ret; /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>*/
unsigned short urc_cnt, rcv_cnt; unsigned short urc_cnt, rcv_cnt; /* <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>*/
unsigned char busy : 1; unsigned char busy : 1;
unsigned char suspend: 1; unsigned char suspend: 1;
unsigned char dowork : 1; unsigned char dowork : 1;