2020-09-26 13:50:55 +00:00
|
|
|
|
/******************************************************************************
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @brief ATָ<EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>
|
2020-09-26 13:50:55 +00:00
|
|
|
|
*
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* Copyright (c) 2020~2021, <morro_luo@163.com>
|
2020-09-26 13:50:55 +00:00
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apathe-2.0
|
|
|
|
|
*
|
|
|
|
|
* Change Logs:
|
|
|
|
|
* Date Author Notes
|
|
|
|
|
* 2020-01-02 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* 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>
|
2021-03-03 12:51:14 +00:00
|
|
|
|
* 2021-03-03 Morro <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><EFBFBD><EFBFBD>
|
2020-09-26 13:50:55 +00:00
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
2020-06-13 04:24:28 +00:00
|
|
|
|
#include "at_chat.h"
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
//<2F><>ʱ<EFBFBD>ж<EFBFBD>
|
2021-01-20 14:17:53 +00:00
|
|
|
|
#define AT_IS_TIMEOUT(start, time) (AT_GET_TICK() - (start) > (time))
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**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> ----------*/
|
2021-01-20 14:17:53 +00:00
|
|
|
|
#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
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2020-09-26 13:50:55 +00:00
|
|
|
|
typedef int (*base_work)(at_obj_t *at, ...);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void at_send_line(at_obj_t *at, const char *fmt, va_list args);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
static const inline at_adapter_t *__get_adapter(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-05 14:31:48 +00:00
|
|
|
|
return &at->adap;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-20 14:17:53 +00:00
|
|
|
|
static bool at_is_timeout(at_obj_t *at, unsigned int ms)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-20 14:17:53 +00:00
|
|
|
|
return AT_IS_TIMEOUT(at->timer, ms);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void send_data(at_obj_t *at, const void *buf, unsigned int len)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->adap.write(buf, len);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void print(at_obj_t *at, const char *cmd, ...)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-22 14:14:09 +00:00
|
|
|
|
va_list args;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
va_start(args, cmd);
|
2020-09-26 13:50:55 +00:00
|
|
|
|
at_send_line(at, cmd, args);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
va_end(args);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ճ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static unsigned int get_recv_count(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-05 14:31:48 +00:00
|
|
|
|
return at->recv_cnt;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static char *get_recv_buf(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-05 14:31:48 +00:00
|
|
|
|
return (char *)at->adap.recv_buf;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void recv_buf_clear(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->recv_cnt = 0;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**ǰ<><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static char *search_string(at_obj_t *at, const char *str)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return strstr(get_recv_buf(at), str);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ִֹ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static bool at_isabort(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return at->cursor ? at->cursor->abort : 1;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static void at_reset_timer(at_obj_t *at)
|
|
|
|
|
{
|
|
|
|
|
at->timer = AT_GET_TICK();
|
|
|
|
|
}
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief ATִ<EFBFBD>лص<EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void do_at_callbatk(at_obj_t *a, at_item_t *i, at_callbatk_t cb, at_return ret)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
at_response_t r;
|
2021-01-05 14:31:48 +00:00
|
|
|
|
if ((ret == AT_RET_ERROR || ret == AT_RET_TIMEOUT) && a->adap.error != NULL)
|
|
|
|
|
a->adap.error();
|
|
|
|
|
|
2020-06-13 04:24:28 +00:00
|
|
|
|
if (cb) {
|
|
|
|
|
r.param = i->param;
|
|
|
|
|
r.recvbuf = get_recv_buf(a);
|
|
|
|
|
r.recvcnt = get_recv_count(a);
|
|
|
|
|
r.ret = ret;
|
|
|
|
|
cb(&r);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static bool add_work(at_obj_t *at, void *params, void *info, int type)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
at_item_t *i;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
if (list_empty(&at->ls_idle)) //<2F><EFBFBD><DEBF><EFBFBD>at_item
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return NULL;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
i = list_first_entry(&at->ls_idle, at_item_t, node);//<2F>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ҵ
|
2020-06-13 04:24:28 +00:00
|
|
|
|
i->info = (void *)info;
|
|
|
|
|
i->param = (void *)params;
|
|
|
|
|
i->state = AT_STATE_WAIT;
|
|
|
|
|
i->type = type;
|
|
|
|
|
i->abort = 0;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
list_move_tail(&i->node, &at->ls_ready); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return i != 0;
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ
|
2020-06-13 04:24:28 +00:00
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static int do_work_handler(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
at_item_t *i = at->cursor;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
return ((int (*)(at_env_t *e))i->info)(&at->env);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* @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>ҵ,
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static int do_cmd_handler(at_obj_t *a)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
at_item_t *i = a->cursor;
|
|
|
|
|
at_env_t *e = &a->env;
|
2021-01-05 14:31:48 +00:00
|
|
|
|
const at_cmd_t *c = (at_cmd_t *)i->info;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
switch(e->state) {
|
|
|
|
|
case 0: /*<2A><><EFBFBD><EFBFBD>״̬ ------------------------------------------------------*/
|
|
|
|
|
c->sender(e);
|
|
|
|
|
e->state++;
|
|
|
|
|
e->reset_timer(a);
|
|
|
|
|
e->recvclr(a);
|
|
|
|
|
break;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
case 1:
|
|
|
|
|
if (search_string(a, c->matcher)) { //<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
|
|
|
|
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, c->cb, AT_RET_OK);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
} else if (search_string(a, "ERROR")) {
|
|
|
|
|
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
|
2020-06-13 04:24:28 +00:00
|
|
|
|
if (++e->i >= c->retry) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, c->cb, AT_RET_ERROR);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2021-01-05 14:31:48 +00:00
|
|
|
|
e->state = 2; /* <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1>*/
|
|
|
|
|
e->reset_timer(a); /* <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
2021-01-20 14:17:53 +00:00
|
|
|
|
} else if (e->is_timeout(a, c->timeout)) { /* <20><>Ӧ<EFBFBD><D3A6>ʱ*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
if (++e->i >= c->retry) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, c->cb, AT_RET_TIMEOUT);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->state = 0; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ״̬*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
if (e->is_timeout(a, 500))
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->state = 0; /*<2A><><EFBFBD>س<EFBFBD>ʼ״̬*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
e->state = 0;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/**
|
2021-01-05 14:31:48 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @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>ҵ,
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static int send_signlline_handler(at_obj_t *a)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
at_item_t *i = a->cursor;
|
|
|
|
|
at_env_t *e = &a->env;
|
|
|
|
|
const char *cmd = (const char *)i->param;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
at_callbatk_t cb = (at_callbatk_t)i->info;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
|
|
|
|
switch(e->state) {
|
|
|
|
|
case 0: /*<2A><><EFBFBD><EFBFBD>״̬ ------------------------------------------------------*/
|
|
|
|
|
e->printf(a, cmd);
|
|
|
|
|
e->state++;
|
|
|
|
|
e->reset_timer(a);
|
|
|
|
|
e->recvclr(a);
|
|
|
|
|
break;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
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>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
} else if (search_string(a, "ERROR")) {
|
2021-01-20 14:17:53 +00:00
|
|
|
|
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
|
2020-06-13 04:24:28 +00:00
|
|
|
|
if (++e->i >= 3) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, cb, AT_RET_ERROR);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->state = 2; /*<2A><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1>*/
|
|
|
|
|
e->reset_timer(a); /*<2A><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
} else if (e->is_timeout(a, 3000 + e->i * 2000)) {
|
|
|
|
|
if (++e->i >= 3) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, cb, AT_RET_TIMEOUT);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->state = 0; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ״̬*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
if (e->is_timeout(a, 500))
|
2021-01-05 14:31:48 +00:00
|
|
|
|
e->state = 0; /**<2A><><EFBFBD>س<EFBFBD>ʼ״̬*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
e->state = 0;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @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>ҵ,
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static int send_multiline_handler(at_obj_t *a)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
at_item_t *i = a->cursor;
|
|
|
|
|
at_env_t *e = &a->env;
|
|
|
|
|
const char **cmds = (const char **)i->param;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
at_callbatk_t cb = (at_callbatk_t)i->info;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
switch(e->state) {
|
|
|
|
|
case 0:
|
2021-01-05 14:31:48 +00:00
|
|
|
|
if (cmds[e->i] == NULL) { /**<2A><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, cb, AT_RET_OK);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
e->printf(a, "%s\r\n", cmds[e->i]);
|
2021-01-05 14:31:48 +00:00
|
|
|
|
e->recvclr(a); /**<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
e->reset_timer(a);
|
|
|
|
|
e->state++;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
2021-01-20 14:17:53 +00:00
|
|
|
|
if (search_string(a, "OK")) {
|
2020-06-13 04:24:28 +00:00
|
|
|
|
e->state = 0;
|
|
|
|
|
e->i++;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->j = 0;
|
|
|
|
|
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
|
2020-06-13 04:24:28 +00:00
|
|
|
|
} else if (search_string(a, "ERROR")) {
|
2021-01-20 14:17:53 +00:00
|
|
|
|
AT_DEBUG("<-\r\n%s\r\n", get_recv_buf(a));
|
2020-06-13 04:24:28 +00:00
|
|
|
|
if (++e->j >= 3) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, cb, AT_RET_ERROR);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->state = 2; /*<2A><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1>*/
|
|
|
|
|
e->reset_timer(a); /*<2A><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
2020-06-13 04:24:28 +00:00
|
|
|
|
} else if (e->is_timeout(a, 3000)) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
do_at_callbatk(a, i, cb, AT_RET_TIMEOUT);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
case 2:
|
|
|
|
|
if (e->is_timeout(a, 500))
|
|
|
|
|
e->state = 0; /**<2A><><EFBFBD>س<EFBFBD>ʼ״̬*/
|
|
|
|
|
break;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
default:
|
|
|
|
|
e->state = 0;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param[in] fmt - <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @param[in] args - <EFBFBD>ɱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void at_send_line(at_obj_t *at, const char *fmt, va_list args)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
char buf[MAX_AT_CMD_LEN];
|
|
|
|
|
int len;
|
2021-01-05 14:31:48 +00:00
|
|
|
|
const at_adapter_t *adt = __get_adapter(at);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
len = vsnprintf(buf, sizeof(buf), fmt, args);
|
|
|
|
|
|
2020-09-26 13:50:55 +00:00
|
|
|
|
recv_buf_clear(at); //<2F><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
send_data(at, buf, len);
|
|
|
|
|
send_data(at, "\r\n", 2);
|
2021-01-20 14:17:53 +00:00
|
|
|
|
|
|
|
|
|
AT_DEBUG("->\r\n%s\r\n", buf);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @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>С
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void urc_handler_entry(at_obj_t *at, char *urc, unsigned int size)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
int i, n;
|
2021-01-05 14:31:48 +00:00
|
|
|
|
utc_item_t *tbl = at->adap.utc_tbl;
|
2021-03-04 12:21:47 +00:00
|
|
|
|
for (i = 0; i < at->adap.urc_tbl_count; i++, tbl++) {
|
2021-01-20 14:17:53 +00:00
|
|
|
|
n = strlen(tbl->prefix);
|
2021-03-04 12:21:47 +00:00
|
|
|
|
if (strncmp(urc, tbl->prefix, n) == 0) { /* ƥ<><C6A5>ǰ */
|
|
|
|
|
tbl->handler(urc, size); /* <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>*/
|
2021-01-20 14:17:53 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
if (at->cursor == NULL)
|
|
|
|
|
AT_DEBUG("<=\r\n%s\r\n", urc);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief urc <EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param[in] buf - <EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-22 14:14:09 +00:00
|
|
|
|
char *urc_buf;
|
2021-03-03 12:51:14 +00:00
|
|
|
|
int ch;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
unsigned short urc_size;
|
2021-01-05 14:31:48 +00:00
|
|
|
|
urc_buf = (char *)at->adap.urc_buf;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
urc_size = at->adap.urc_bufsize;
|
|
|
|
|
|
2020-09-26 13:50:55 +00:00
|
|
|
|
if (size == 0 && at->urc_cnt > 0) {
|
2021-01-20 14:17:53 +00:00
|
|
|
|
if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* <20><><EFBFBD>ճ<EFBFBD>ʱ*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
urc_handler_entry(at, urc_buf, at->urc_cnt);
|
2021-03-04 12:21:47 +00:00
|
|
|
|
if (at->urc_cnt > 1)
|
|
|
|
|
AT_DEBUG("Urc recv timeout.\r\n");
|
2021-03-03 12:51:14 +00:00
|
|
|
|
at->urc_cnt = 0;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
} else if (urc_buf != NULL){
|
|
|
|
|
at->urc_timer = AT_GET_TICK();
|
2020-06-13 04:24:28 +00:00
|
|
|
|
while (size--) {
|
2021-03-03 12:51:14 +00:00
|
|
|
|
ch = *buf++;
|
|
|
|
|
urc_buf[at->urc_cnt++] = ch;
|
|
|
|
|
if (ch == '\n' || ch == '\r' || ch == '\0') { /*urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
urc_buf[at->urc_cnt] = '\0';
|
2021-03-03 12:51:14 +00:00
|
|
|
|
if (at->urc_cnt > 2)
|
|
|
|
|
urc_handler_entry(at, urc_buf, at->urc_cnt);
|
|
|
|
|
at->urc_cnt = 0;
|
|
|
|
|
} else if (at->urc_cnt >= urc_size) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
2021-01-20 14:17:53 +00:00
|
|
|
|
at->urc_cnt = 0;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void resp_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2021-01-05 14:31:48 +00:00
|
|
|
|
char *recv_buf;
|
|
|
|
|
unsigned short recv_size;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
recv_buf = (char *)at->adap.recv_buf;
|
|
|
|
|
recv_size = at->adap.recv_bufsize;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
if (at->recv_cnt + size >= recv_size) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
at->recv_cnt = 0;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
|
2021-01-20 14:17:53 +00:00
|
|
|
|
memcpy(recv_buf + at->recv_cnt, buf, size);
|
2021-01-05 14:31:48 +00:00
|
|
|
|
at->recv_cnt += size;
|
|
|
|
|
recv_buf[at->recv_cnt] = '\0';
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @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>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @param[in] work - AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param[in] params -
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
bool at_do_work(at_obj_t *at, int (*work)(at_env_t *e), void *params)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return add_work(at, params, (void *)work, AT_TYPE_WORK);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief ִ<EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD>
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @param[in] a - AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @param[in] cmd - cmd<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2021-01-05 14:31:48 +00:00
|
|
|
|
bool at_do_cmd(at_obj_t *at, void *params, const at_cmd_t *cmd)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return add_work(at, params, (void *)cmd, AT_TYPE_CMD);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @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>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @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>Ч
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
bool at_send_singlline(at_obj_t *at, at_callbatk_t cb, const char *singlline)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return add_work(at, (void *)singlline, (void *)cb, AT_TYPE_SINGLLINE);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @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>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @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
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
bool at_send_multiline(at_obj_t *at, at_callbatk_t cb, const char **multiline)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return add_work(at, multiline, (void *)cb, AT_TYPE_MULTILINE);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2021-01-20 14:17:53 +00:00
|
|
|
|
* @brief ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹAT<EFBFBD><EFBFBD>ҵ
|
2020-06-13 04:24:28 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void at_item_abort(at_item_t *i)
|
|
|
|
|
{
|
2020-09-22 14:14:09 +00:00
|
|
|
|
i->abort = 1;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2021-01-20 14:17:53 +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-06-13 04:24:28 +00:00
|
|
|
|
*/
|
2021-01-20 14:17:53 +00:00
|
|
|
|
bool at_obj_busy(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
return !list_empty(&at->ls_ready);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2021-01-05 14:31:48 +00:00
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static void at_work_manager(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
2020-09-26 13:50:55 +00:00
|
|
|
|
at_env_t *e = &at->env;
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/*<2A><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
static int (*const work_handler_table[])(at_obj_t *) = {
|
2020-09-22 14:14:09 +00:00
|
|
|
|
do_work_handler,
|
2020-06-13 04:24:28 +00:00
|
|
|
|
do_cmd_handler,
|
2021-01-20 14:17:53 +00:00
|
|
|
|
send_multiline_handler,
|
|
|
|
|
send_signlline_handler
|
2020-06-13 04:24:28 +00:00
|
|
|
|
};
|
2020-09-26 13:50:55 +00:00
|
|
|
|
if (at->cursor == NULL) {
|
|
|
|
|
if (list_empty(&at->ls_ready)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
|
2020-06-13 04:24:28 +00:00
|
|
|
|
return;
|
|
|
|
|
e->i = 0;
|
|
|
|
|
e->j = 0;
|
|
|
|
|
e->state = 0;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
at->cursor = list_first_entry(&at->ls_ready, at_item_t, node);
|
2021-01-20 14:17:53 +00:00
|
|
|
|
e->params = at->cursor->param;
|
|
|
|
|
e->recvclr(at);
|
|
|
|
|
e->reset_timer(at);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
/* <20><><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[at->cursor->type](at) || at->cursor->abort) {
|
2020-09-26 13:50:55 +00:00
|
|
|
|
list_move_tail(&at->cursor->node, &at->ls_idle);
|
|
|
|
|
at->cursor = NULL;
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-01-20 14:17:53 +00:00
|
|
|
|
|
2021-01-05 14:31:48 +00:00
|
|
|
|
/**
|
2020-06-13 04:24:28 +00:00
|
|
|
|
* @brief AT<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-26 13:50:55 +00:00
|
|
|
|
void at_poll_task(at_obj_t *at)
|
2020-06-13 04:24:28 +00:00
|
|
|
|
{
|
|
|
|
|
char rbuf[32];
|
|
|
|
|
int read_size;
|
2020-09-26 13:50:55 +00:00
|
|
|
|
read_size = __get_adapter(at)->read(rbuf, sizeof(rbuf));
|
|
|
|
|
urc_recv_process(at, rbuf, read_size);
|
|
|
|
|
resp_recv_process(at, rbuf, read_size);
|
|
|
|
|
at_work_manager(at);
|
2020-06-13 04:24:28 +00:00
|
|
|
|
}
|