2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
******************************************************************************
|
|
|
|
|
* @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>
|
2021-05-15 07:37:00 +00:00
|
|
|
|
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-07-20 12:48:54 +00:00
|
|
|
|
* 2021-07-20 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>at_do_workʱurc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-11-28 07:57:36 +00:00
|
|
|
|
* 2021-11-20 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>urc<EFBFBD>¼<EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-04-18 06:47:22 +00:00
|
|
|
|
******************************************************************************
|
|
|
|
|
*/
|
2021-02-28 04:12:41 +00:00
|
|
|
|
#include "at.h"
|
|
|
|
|
#include "comdef.h"
|
2020-09-22 14:14:09 +00:00
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdio.h>
|
2021-02-19 14:21:05 +00:00
|
|
|
|
#include <stddef.h>
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-07-20 12:48:54 +00:00
|
|
|
|
#define MAX_AT_LOCK_TIME 60 * 1000 //AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
|
|
|
|
static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size);
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief Ĭ<EFBFBD>ϵ<EFBFBD><EFBFBD>Խӿ<EFBFBD>
|
|
|
|
|
*/
|
2021-02-19 14:21:05 +00:00
|
|
|
|
static void nop_dbg(const char *fmt, ...){}
|
|
|
|
|
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
static void put_string(at_obj_t *at, const char *s)
|
|
|
|
|
{
|
|
|
|
|
while (*s != '\0')
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->adap.write(s++, 1);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
static void put_line(at_obj_t *at, const char *s)
|
|
|
|
|
{
|
|
|
|
|
put_string(at, s);
|
|
|
|
|
put_string(at, "\r\n");
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->adap.debug("->\r\n%s\r\n", s);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-20 12:48:54 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static unsigned int at_work_read(struct at_work_ctx *e, void *buf, unsigned int len)
|
|
|
|
|
{
|
|
|
|
|
at_obj_t *at = e->at;
|
|
|
|
|
len = at->adap.read(buf, len);
|
|
|
|
|
urc_recv_process(at, buf, len); //<2F>ݽ<EFBFBD><DDBD><EFBFBD>URC<52><43><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
|
|
|
|
return len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ҵд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static unsigned int at_work_write(struct at_work_ctx *e, const void *buf, unsigned int len)
|
|
|
|
|
{
|
|
|
|
|
return e->at->adap.write(buf, len);
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-22 14:14:09 +00:00
|
|
|
|
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
|
2021-07-20 12:48:54 +00:00
|
|
|
|
static void at_work_print(struct at_work_ctx *e, const char *cmd, ...)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
2021-02-19 14:21:05 +00:00
|
|
|
|
va_list args;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
va_start(args, cmd);
|
|
|
|
|
char buf[MAX_AT_CMD_LEN];
|
|
|
|
|
vsnprintf(buf, sizeof(buf), cmd, args);
|
2021-04-18 06:47:22 +00:00
|
|
|
|
put_line(e->at, buf);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
va_end(args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F>ȴ<EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
|
|
|
|
static at_return wait_resp(at_obj_t *at, at_respond_t *r)
|
2021-04-18 06:47:22 +00:00
|
|
|
|
{
|
2020-09-22 14:14:09 +00:00
|
|
|
|
at->ret = AT_RET_TIMEOUT;
|
|
|
|
|
at->resp_timer = at_get_ms();
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->rcv_cnt = 0; //<2F><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD>
|
2021-04-18 06:47:22 +00:00
|
|
|
|
at->resp = r;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at_sem_wait(at->completed, r->timeout);
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->adap.debug("<-\r\n%s\r\n", r->recvbuf);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
at->resp = NULL;
|
|
|
|
|
return at->ret;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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>
|
|
|
|
|
*/
|
2021-07-20 12:48:54 +00:00
|
|
|
|
at_return wait_recv(struct at_work_ctx *e, const char *resp, unsigned int timeout)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
|
|
|
|
char buf[64];
|
|
|
|
|
int cnt = 0, len;
|
2021-04-18 06:47:22 +00:00
|
|
|
|
at_obj_t *at = e->at;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
at_return ret = AT_RET_TIMEOUT;
|
|
|
|
|
unsigned int timer = at_get_ms();
|
|
|
|
|
while (at_get_ms() - timer < timeout) {
|
2021-07-20 12:48:54 +00:00
|
|
|
|
len = e->read(e, &buf[cnt], sizeof(buf) - cnt);
|
|
|
|
|
if (len > 0) {
|
|
|
|
|
cnt += len;
|
|
|
|
|
buf[cnt] = '\0';
|
|
|
|
|
if (strstr(buf, resp)) {
|
|
|
|
|
ret = AT_RET_OK;
|
|
|
|
|
break;
|
|
|
|
|
} else if (strstr(buf, "ERROR")) {
|
|
|
|
|
ret = AT_RET_ERROR;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else
|
|
|
|
|
at_delay(1);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->adap.debug("%s\r\n", buf);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->adap = *adap;
|
2021-07-20 12:48:54 +00:00
|
|
|
|
at->rcv_cnt = 0;
|
|
|
|
|
at->send_lock = at_sem_new(1);
|
|
|
|
|
at->recv_lock = at_sem_new(1);
|
|
|
|
|
at->completed = at_sem_new(0);
|
2021-05-15 07:37:00 +00:00
|
|
|
|
at->urc_item = NULL;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
if (at->adap.debug == NULL)
|
|
|
|
|
at->adap.debug = nop_dbg;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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>
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd)
|
|
|
|
|
{
|
|
|
|
|
at_return ret;
|
|
|
|
|
char defbuf[64];
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at_respond_t default_resp = {"OK", defbuf, sizeof(defbuf), 5000};
|
2020-09-22 14:14:09 +00:00
|
|
|
|
if (r == NULL) {
|
|
|
|
|
r = &default_resp; //Ĭ<><C4AC><EFBFBD><EFBFBD>Ӧ
|
|
|
|
|
}
|
2021-07-20 12:48:54 +00:00
|
|
|
|
if (!at_sem_wait(at->send_lock, r->timeout)) {
|
2020-09-22 14:14:09 +00:00
|
|
|
|
return AT_RET_TIMEOUT;
|
|
|
|
|
}
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->busy = true;
|
|
|
|
|
|
2020-09-22 14:14:09 +00:00
|
|
|
|
while (at->urc_cnt) {
|
|
|
|
|
at_delay(10);
|
|
|
|
|
}
|
|
|
|
|
put_line(at, cmd);
|
|
|
|
|
ret = wait_resp(at, r);
|
2021-07-20 12:48:54 +00:00
|
|
|
|
at_sem_post(at->send_lock);
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->busy = false;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
2021-04-18 06:47:22 +00:00
|
|
|
|
at_work_ctx_t ctx;
|
|
|
|
|
int ret;
|
2021-07-20 12:48:54 +00:00
|
|
|
|
if (!at_sem_wait(at->send_lock, MAX_AT_LOCK_TIME)) {
|
2021-01-05 14:31:48 +00:00
|
|
|
|
return AT_RET_TIMEOUT;
|
|
|
|
|
}
|
2021-07-20 12:48:54 +00:00
|
|
|
|
if (!at_sem_wait(at->recv_lock, MAX_AT_LOCK_TIME))
|
|
|
|
|
return AT_RET_TIMEOUT;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->busy = true;
|
2021-04-18 06:47:22 +00:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>at_work_ctx_t
|
|
|
|
|
ctx.params = params;
|
2021-07-20 12:48:54 +00:00
|
|
|
|
ctx.printf = at_work_print;
|
|
|
|
|
ctx.read = at_work_read;
|
|
|
|
|
ctx.write = at_work_write;
|
2021-04-18 06:47:22 +00:00
|
|
|
|
ctx.wait_resp = wait_recv;
|
|
|
|
|
ctx.at = at;
|
2021-07-20 12:48:54 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->rcv_cnt = 0;
|
2021-04-18 06:47:22 +00:00
|
|
|
|
ret = work(&ctx);
|
2021-07-20 12:48:54 +00:00
|
|
|
|
at_sem_post(at->recv_lock);
|
|
|
|
|
at_sem_post(at->send_lock);
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at->busy = false;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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>
|
|
|
|
|
*/
|
2021-01-05 14:31:48 +00:00
|
|
|
|
int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separator)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
|
|
|
|
char *s = recvbuf;
|
|
|
|
|
size_t i = 0;
|
|
|
|
|
if (s == NULL || lines == NULL)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
lines[i++] = s;
|
|
|
|
|
while(*s && i < count) {
|
|
|
|
|
if (*s == ',') {
|
|
|
|
|
*s = '\0';
|
|
|
|
|
lines[i++] = s + 1; /*ָ<><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ӵ<EFBFBD>*/
|
|
|
|
|
}
|
|
|
|
|
s++;
|
|
|
|
|
}
|
2021-02-19 14:21:05 +00:00
|
|
|
|
return i;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
2021-05-15 07:37:00 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD>URC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ѯURC<EFBFBD><EFBFBD>
|
2021-04-18 06:47:22 +00:00
|
|
|
|
* @param[in] urcline - URC<EFBFBD><EFBFBD>
|
|
|
|
|
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, false - δʶ<EFBFBD><EFBFBD>URC
|
|
|
|
|
*/
|
2021-05-15 07:37:00 +00:00
|
|
|
|
const urc_item_t *find_urc_item(at_obj_t *at, char *urc_buf, unsigned int size)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
2021-05-15 07:37:00 +00:00
|
|
|
|
const urc_item_t *tbl = at->adap.utc_tbl;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
int i;
|
2021-05-15 07:37:00 +00:00
|
|
|
|
if (size < 2)
|
|
|
|
|
return NULL;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
for (i = 0; i < at->adap.urc_tbl_count; i++) {
|
2021-05-15 07:37:00 +00:00
|
|
|
|
if (strstr(urc_buf, tbl->prefix))
|
|
|
|
|
return tbl;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
tbl++;
|
|
|
|
|
}
|
2021-05-15 07:37:00 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param[in] urcline - URC<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static void urc_handler_entry(at_obj_t *at, char *urcline, unsigned int size)
|
|
|
|
|
{
|
|
|
|
|
at_urc_ctx_t context = {at->adap.read, urcline, at->adap.urc_bufsize, size};
|
|
|
|
|
at->adap.debug("<=\r\n%s\r\n", urcline);
|
|
|
|
|
at->urc_item->handler(&context); /* <20>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ϲ㴦<CFB2><E3B4A6> */
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief urc <EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param[in] ch - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
|
|
|
|
{
|
2021-02-19 14:21:05 +00:00
|
|
|
|
register char *urc_buf;
|
|
|
|
|
int ch;
|
|
|
|
|
urc_buf = at->adap.urc_buf;
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>,Ĭ<><C4AC>MAX_URC_RECV_TIMEOUT
|
2021-04-18 06:47:22 +00:00
|
|
|
|
if (at->urc_cnt > 0 && at_istimeout(at->urc_timer, MAX_URC_RECV_TIMEOUT)) {
|
2021-02-19 14:21:05 +00:00
|
|
|
|
urc_buf[at->urc_cnt] = '\0';
|
2021-04-18 06:47:22 +00:00
|
|
|
|
if (at->urc_cnt > 2)
|
|
|
|
|
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
|
2021-08-01 03:36:27 +00:00
|
|
|
|
at->urc_cnt = 0;
|
|
|
|
|
at->urc_item = NULL;
|
2021-05-15 07:37:00 +00:00
|
|
|
|
}
|
2021-08-01 03:36:27 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
while (size--) {
|
2021-08-01 03:36:27 +00:00
|
|
|
|
at->urc_timer = at_get_ms();
|
2021-02-19 14:21:05 +00:00
|
|
|
|
ch = *buf++;
|
|
|
|
|
urc_buf[at->urc_cnt++] = ch;
|
|
|
|
|
|
2021-05-15 07:37:00 +00:00
|
|
|
|
if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|
|
|
|
urc_buf[at->urc_cnt] = '\0';
|
|
|
|
|
if (at->urc_item == NULL)
|
|
|
|
|
at->urc_item = find_urc_item(at, urc_buf, at->urc_cnt);
|
|
|
|
|
if (at->urc_item != NULL){
|
|
|
|
|
if (strchr(at->urc_item->end_mark, ch)) { //ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
urc_handler_entry(at, urc_buf, at->urc_cnt);
|
|
|
|
|
at->urc_cnt = 0;
|
|
|
|
|
at->urc_item = NULL;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
}
|
2021-05-15 07:37:00 +00:00
|
|
|
|
} else if (ch == '\r' || ch == '\n'|| ch == '\0') {
|
|
|
|
|
if (at->urc_cnt > 2 && !at->busy) {
|
|
|
|
|
at->adap.debug("%s\r\n", urc_buf); //δʶ<CEB4><EFBFBD>URC
|
|
|
|
|
}
|
|
|
|
|
at->urc_cnt = 0;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
2021-05-15 07:37:00 +00:00
|
|
|
|
} else if (at->urc_cnt >= at->adap.urc_bufsize) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
at->urc_cnt = 0;
|
|
|
|
|
at->urc_item = NULL;
|
|
|
|
|
}
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ֪ͨ
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2021-02-19 14:21:05 +00:00
|
|
|
|
static void resp_notification(at_obj_t *at, at_return ret)
|
|
|
|
|
{
|
2021-11-28 07:57:36 +00:00
|
|
|
|
at->ret = ret;
|
|
|
|
|
at->resp = NULL;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at_sem_post(at->completed);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
static void resp_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
|
|
|
|
{
|
|
|
|
|
char *rcv_buf;
|
|
|
|
|
unsigned short rcv_size;
|
|
|
|
|
at_respond_t *resp = at->resp;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
if (resp == NULL) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2020-09-22 14:14:09 +00:00
|
|
|
|
return;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
if (size) {
|
|
|
|
|
rcv_buf = (char *)resp->recvbuf;
|
|
|
|
|
rcv_size = resp->bufsize;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
if (at->rcv_cnt + size >= rcv_size) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
at->rcv_cnt = 0;
|
|
|
|
|
at->adap.debug("Receive overflow:%s", rcv_buf);
|
|
|
|
|
}
|
|
|
|
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>rcv_buf<75><66> ---------------------------------------------*/
|
|
|
|
|
memcpy(rcv_buf + at->rcv_cnt, buf, size);
|
|
|
|
|
at->rcv_cnt += size;
|
|
|
|
|
rcv_buf[at->rcv_cnt] = '\0';
|
|
|
|
|
|
|
|
|
|
if (strstr(rcv_buf, resp->matcher)) { //<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
|
|
|
|
resp_notification(at, AT_RET_OK);
|
2021-04-18 06:47:22 +00:00
|
|
|
|
return;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
} else if (strstr(rcv_buf, "ERROR")) {
|
|
|
|
|
resp_notification(at, AT_RET_ERROR);
|
2021-04-18 06:47:22 +00:00
|
|
|
|
return;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
if (at_istimeout(at->resp_timer, resp->timeout)) //<2F><><EFBFBD>ճ<EFBFBD>ʱ
|
|
|
|
|
resp_notification(at, AT_RET_TIMEOUT);
|
2021-02-19 14:21:05 +00:00
|
|
|
|
else if (at->suspend) //ǿ<><C7BF><EFBFBD><EFBFBD>ֹ
|
|
|
|
|
resp_notification(at, AT_RET_ABORT);
|
|
|
|
|
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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>
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
bool at_obj_busy(at_obj_t *at)
|
|
|
|
|
{
|
2021-04-18 06:47:22 +00:00
|
|
|
|
return !at->busy && at_istimeout(at->urc_timer, 2000);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
void at_suspend(at_obj_t *at)
|
|
|
|
|
{
|
|
|
|
|
at->suspend = 1;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD>ָ<EFBFBD>AT<EFBFBD><EFBFBD>ҵ
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
void at_resume(at_obj_t *at)
|
|
|
|
|
{
|
|
|
|
|
at->suspend = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 06:47:22 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2021-02-19 14:21:05 +00:00
|
|
|
|
void at_process(at_obj_t *at)
|
2020-09-22 14:14:09 +00:00
|
|
|
|
{
|
2021-11-28 07:57:36 +00:00
|
|
|
|
char buf[1];
|
2021-02-19 14:21:05 +00:00
|
|
|
|
unsigned int len;
|
2021-07-20 12:48:54 +00:00
|
|
|
|
if (!at_sem_wait(at->recv_lock, MAX_AT_LOCK_TIME))
|
2021-02-19 14:21:05 +00:00
|
|
|
|
return;
|
|
|
|
|
do {
|
2021-07-20 12:48:54 +00:00
|
|
|
|
len = at->adap.read(buf, sizeof(buf));
|
|
|
|
|
urc_recv_process(at, buf,len);
|
|
|
|
|
resp_recv_process(at, buf, len);
|
2021-02-19 14:21:05 +00:00
|
|
|
|
} while (len);
|
2021-07-20 12:48:54 +00:00
|
|
|
|
|
|
|
|
|
at_sem_post(at->recv_lock);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}
|