summaryrefslogtreecommitdiff
path: root/components/net/at
diff options
context:
space:
mode:
authorsszlbg <[email protected]>2021-07-25 17:00:00 +0800
committersszlbg <[email protected]>2021-07-25 17:00:00 +0800
commitbf88963a3ec85ce6da013e4cd1c59ec5041d29e1 (patch)
treed4cd7d4fa3ff6e7b0c859a7660209787f47d168b /components/net/at
parent88d4faf68735948d6310e2d2271d576c5de254a0 (diff)
parent2b201cbb00c512def085332d7fb09194656418b9 (diff)
Merge branch 'master' into at_client-rt_realloc_iss
# Conflicts: # components/net/at/src/at_client.c
Diffstat (limited to 'components/net/at')
-rw-r--r--components/net/at/at_socket/at_socket.c19
-rw-r--r--components/net/at/include/at.h8
-rw-r--r--components/net/at/src/at_client.c23
-rw-r--r--components/net/at/src/at_server.c10
-rw-r--r--components/net/at/src/at_utils.c25
5 files changed, 65 insertions, 20 deletions
diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c
index 6d4c040856..8215dd4417 100644
--- a/components/net/at/at_socket/at_socket.c
+++ b/components/net/at/at_socket/at_socket.c
@@ -13,6 +13,7 @@
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
+#include <sys/errno.h>
#include <at_socket.h>
#include <at_device.h>
@@ -78,7 +79,7 @@ struct at_socket *at_get_socket(int socket)
}
/* get a block to the AT socket receive list*/
-static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
+static rt_err_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
{
at_recv_pkt_t pkt = RT_NULL;
@@ -86,7 +87,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
if (pkt == RT_NULL)
{
LOG_E("No memory for receive packet table!");
- return 0;
+ return -RT_ENOMEM;
}
pkt->bfsz_totle = length;
@@ -95,7 +96,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
rt_slist_append(rlist, &pkt->list);
- return length;
+ return RT_EOK;
}
/* delete and free all receive buffer list */
@@ -651,14 +652,20 @@ static void at_recv_notice_cb(struct at_socket *sock, at_socket_evt_t event, con
RT_ASSERT(event == AT_SOCKET_EVT_RECV);
/* check the socket object status */
- if (sock->magic != AT_SOCKET_MAGIC)
+ if (sock->magic != AT_SOCKET_MAGIC || sock->state == AT_SOCKET_CLOSED)
{
+ rt_free((void *)buff);
return;
}
/* put receive buffer to receiver packet list */
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER);
- at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz);
+ if (at_recvpkt_put(&(sock->recvpkt_list), buff, bfsz) != RT_EOK)
+ {
+ rt_free((void *)buff);
+ rt_mutex_release(sock->recv_lock);
+ return;
+ }
rt_mutex_release(sock->recv_lock);
rt_sem_release(sock->recv_notice);
@@ -815,7 +822,7 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f
/* wait the receive semaphore */
if (rt_sem_take(sock->recv_notice, timeout) < 0)
{
- LOG_E("AT socket (%d) receive timeout (%d)!", socket, timeout);
+ LOG_D("AT socket (%d) receive timeout (%d)!", socket, timeout);
errno = EAGAIN;
result = -1;
goto __exit;
diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h
index c6d0e3a5ce..0e93720ff0 100644
--- a/components/net/at/include/at.h
+++ b/components/net/at/include/at.h
@@ -113,10 +113,10 @@ typedef struct at_server *at_server_t;
#ifdef AT_USING_CLIENT
enum at_resp_status
{
- AT_RESP_OK = 0, /* AT response end is OK */
- AT_RESP_ERROR = -1, /* AT response end is ERROR */
- AT_RESP_TIMEOUT = -2, /* AT response is timeout */
- AT_RESP_BUFF_FULL= -3, /* AT response buffer is full */
+ AT_RESP_OK = 0, /* AT response end is OK */
+ AT_RESP_ERROR = -1, /* AT response end is ERROR */
+ AT_RESP_TIMEOUT = -2, /* AT response is timeout */
+ AT_RESP_BUFF_FULL= -3, /* AT response buffer is full */
};
typedef enum at_resp_status at_resp_status_t;
diff --git a/components/net/at/src/at_client.c b/components/net/at/src/at_client.c
index f40d7698a7..948020f4cf 100644
--- a/components/net/at/src/at_client.c
+++ b/components/net/at/src/at_client.c
@@ -29,6 +29,10 @@
static struct at_client at_client_table[AT_CLIENT_NUM_MAX] = { 0 };
+extern rt_size_t at_utils_send(rt_device_t dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size);
extern rt_size_t at_vprintfln(rt_device_t device, const char *format, va_list args);
extern void at_print_raw_cmd(const char *type, const char *cmd, rt_size_t size);
extern const char *at_get_last_cmd(rt_size_t *cmd_size);
@@ -393,7 +397,7 @@ int at_client_obj_wait_connect(at_client_t client, rt_uint32_t timeout)
/* Check whether it is already connected */
resp->buf_len = 0;
resp->line_counts = 0;
- rt_device_write(client->device, 0, "AT\r\n", 4);
+ at_utils_send(client->device, 0, "AT\r\n", 4);
if (rt_sem_take(client->resp_notice, resp->timeout) != RT_EOK)
continue;
@@ -434,7 +438,13 @@ rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size
at_print_raw_cmd("sendline", buf, size);
#endif
- return rt_device_write(client->device, 0, buf, size);
+ rt_mutex_take(client->lock, RT_WAITING_FOREVER);
+
+ rt_size_t len = at_utils_send(client->device, 0, buf, size);
+
+ rt_mutex_release(client->lock);
+
+ return len;
}
static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeout)
@@ -725,6 +735,8 @@ static void client_parser(at_client_t client)
{
at_response_t resp = client->resp;
+ char end_ch = client->recv_line_buf[client->recv_line_len - 1];
+
/* current receive is response */
client->recv_line_buf[client->recv_line_len - 1] = '\0';
if (resp->buf_len + client->recv_line_len < resp->buf_size)
@@ -742,7 +754,12 @@ static void client_parser(at_client_t client)
LOG_E("Read response buffer failed. The Response buffer size is out of buffer size(%d)!", resp->buf_size);
}
/* check response result */
- if (rt_memcmp(client->recv_line_buf, AT_RESP_END_OK, rt_strlen(AT_RESP_END_OK)) == 0
+ if ((client->end_sign != 0) && (end_ch == client->end_sign) && (resp->line_num == 0))
+ {
+ /* get the end sign, return response state END_OK.*/
+ client->resp_status = AT_RESP_OK;
+ }
+ else if (rt_memcmp(client->recv_line_buf, AT_RESP_END_OK, rt_strlen(AT_RESP_END_OK)) == 0
&& resp->line_num == 0)
{
/* get the end data by response result, return response state END_OK. */
diff --git a/components/net/at/src/at_server.c b/components/net/at/src/at_server.c
index bfbbbae2d3..1db26a260b 100644
--- a/components/net/at/src/at_server.c
+++ b/components/net/at/src/at_server.c
@@ -38,6 +38,10 @@ static at_server_t at_server_local = RT_NULL;
static at_cmd_t cmd_table = RT_NULL;
static rt_size_t cmd_num;
+extern rt_size_t at_utils_send(rt_device_t dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size);
extern void at_vprintf(rt_device_t device, const char *format, va_list args);
extern void at_vprintfln(rt_device_t device, const char *format, va_list args);
@@ -187,7 +191,7 @@ rt_size_t at_server_send(at_server_t server, const char *buf, rt_size_t size)
return 0;
}
- return rt_device_write(server->device, 0, buf, size);
+ return at_utils_send(server->device, 0, buf, size);
}
/**
@@ -412,7 +416,7 @@ static rt_err_t at_cmd_get_name(const char *cmd_buffer, char *cmd_name)
return -RT_ERROR;
}
-static rt_err_t at_server_gerchar(at_server_t server, char *ch, rt_int32_t timeout)
+static rt_err_t at_server_getchar(at_server_t server, char *ch, rt_int32_t timeout)
{
rt_err_t result = RT_EOK;
@@ -595,7 +599,7 @@ int at_server_init(void)
goto __exit;
}
- at_server_local->get_char = at_server_gerchar;
+ at_server_local->get_char = at_server_getchar;
memcpy(at_server_local->end_mark, AT_CMD_END_MARK, sizeof(AT_CMD_END_MARK));
at_server_local->parser_entry = server_parser;
diff --git a/components/net/at/src/at_utils.c b/components/net/at/src/at_utils.c
index 8d8887fe5e..028f262566 100644
--- a/components/net/at/src/at_utils.c
+++ b/components/net/at/src/at_utils.c
@@ -65,24 +65,41 @@ const char *at_get_last_cmd(rt_size_t *cmd_size)
return send_buf;
}
+RT_WEAK rt_size_t at_utils_send(rt_device_t dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ return rt_device_write(dev, pos, buffer, size);
+}
+
rt_size_t at_vprintf(rt_device_t device, const char *format, va_list args)
{
last_cmd_len = vsnprintf(send_buf, sizeof(send_buf), format, args);
+ if(last_cmd_len > sizeof(send_buf))
+ last_cmd_len = sizeof(send_buf);
#ifdef AT_PRINT_RAW_CMD
at_print_raw_cmd("sendline", send_buf, last_cmd_len);
#endif
- return rt_device_write(device, 0, send_buf, last_cmd_len);
+ return at_utils_send(device, 0, send_buf, last_cmd_len);
}
rt_size_t at_vprintfln(rt_device_t device, const char *format, va_list args)
{
rt_size_t len;
- len = at_vprintf(device, format, args);
+ last_cmd_len = vsnprintf(send_buf, sizeof(send_buf) - 2, format, args);
+ if(last_cmd_len > sizeof(send_buf) - 2)
+ last_cmd_len = sizeof(send_buf) - 2;
+ rt_memcpy(send_buf + last_cmd_len, "\r\n", 2);
- rt_device_write(device, 0, "\r\n", 2);
+ len = last_cmd_len + 2;
+
+#ifdef AT_PRINT_RAW_CMD
+ at_print_raw_cmd("sendline", send_buf, len);
+#endif
- return len + 2;
+ return at_utils_send(device, 0, send_buf, len);
}