at_perf:modify the global lock to protect at agent

This commit is contained in:
mculover666
2022-06-28 15:45:23 +08:00
parent c18f082949
commit 87fd8e839d
6 changed files with 146 additions and 134 deletions

View File

@@ -1,3 +1,7 @@
## [2.5.2] - 2022-06-28
### Changed
- modify the global lock to protect the at agent.
## [2.5.1] - 2022-06-02
### Added
- add dynamic create and destroy api for task, sem, mutex, event, timer and corresponding unit test case.

View File

@@ -42,7 +42,7 @@ static int ec600s_check_ready(void)
{
at_echo_t echo;
int try = 0;
while (try++ < 10) {
tos_at_echo_create(&echo, NULL, 0, NULL);
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT\r\n");
@@ -60,7 +60,7 @@ static int ec600s_echo_close(void)
int try = 0;
tos_at_echo_create(&echo, NULL, 0, NULL);
while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "ATE0\r\n");
if (echo.status == AT_ECHO_STATUS_OK) {
@@ -75,7 +75,7 @@ static int ec600s_sim_card_check(void)
at_echo_t echo;
int try = 0;
char echo_buffer[32];
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CPIN?\r\n");
@@ -84,7 +84,7 @@ static int ec600s_sim_card_check(void)
}
tos_sleep_ms(2000);
}
return -1;
}
@@ -94,7 +94,7 @@ static int ec600s_signal_quality_check(void)
at_echo_t echo;
char echo_buffer[32], *str;
int try = 0;
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CSQ\r\n");
@@ -106,7 +106,7 @@ static int ec600s_signal_quality_check(void)
if (!str) {
return -1;
}
sscanf(str, "+CSQ:%d,%d", &rssi, &ber);
if (rssi != 99) {
return 0;
@@ -122,7 +122,7 @@ static int ec600s_gsm_network_check(void)
at_echo_t echo;
char echo_buffer[32], *str;
int try = 0;
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CREG?\r\n");
@@ -140,8 +140,8 @@ static int ec600s_gsm_network_check(void)
}
tos_sleep_ms(2000);
}
return -1;
return -1;
}
static int ec600s_gprs_network_check(void)
@@ -168,7 +168,7 @@ static int ec600s_gprs_network_check(void)
}
tos_sleep_ms(2000);
}
return -1;
}
@@ -181,7 +181,7 @@ static int ec600s_close_apn(void)
if (echo.status == AT_ECHO_STATUS_OK) {
return 0;
}
return -1;
}
@@ -206,17 +206,17 @@ static int ec600s_set_apn(void)
static int ec600s_init(void)
{
printf("Init ec600s ...\n" );
if (ec600s_check_ready() != 0) {
printf("wait module ready timeout, please check your module\n");
return -1;
}
if (ec600s_echo_close() != 0) {
printf("echo close failed,please check your module\n");
return -1;
}
if(ec600s_sim_card_check() != 0) {
printf("sim card check failed,please insert your card\n");
return -1;
@@ -226,22 +226,22 @@ static int ec600s_init(void)
printf("signal quality check status failed\n");
return -1;
}
if(ec600s_gsm_network_check() != 0) {
printf("GSM network register status check fail\n");
return -1;
}
if(ec600s_gprs_network_check() != 0) {
printf("GPRS network register status check fail\n");
return -1;
}
if(ec600s_close_apn() != 0) {
printf("close apn failed\n");
return -1;
}
if (ec600s_set_apn() != 0) {
printf("apn set FAILED\n");
return -1;
@@ -259,14 +259,14 @@ static int ec600s_connect_establish(int id, sal_proto_t proto)
char *query_result_str = NULL;
char *remote_ip = NULL;
char *remote_port = NULL;
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+QISTATE=1,%d\r\n", id);
if (echo.status != AT_ECHO_STATUS_OK) {
printf("query socket %d state fail\r\n", id);
return -1;
}
sprintf(except_str, "+QISTATE: %d", id);
query_result_str = strstr(echo_buffer, except_str);
if (query_result_str) {
@@ -277,13 +277,13 @@ static int ec600s_connect_establish(int id, sal_proto_t proto)
memset(except_str, 0, sizeof(except_str));
sprintf(except_str, "+QIOPEN: %d,0", id);
remote_ip = (char*)tos_at_channel_ip_get(AT_AGENT, id);
remote_port = (char*)tos_at_channel_port_get(AT_AGENT, id);
if (!remote_ip || !remote_port) {
return -2;
}
tos_at_echo_create(&echo, NULL, 0, except_str);
tos_at_cmd_exec_until(AT_AGENT, &echo, 4000, "AT+QIOPEN=1,%d,\"%s\",\"%s\",%d,0,1\r\n",
id, proto == TOS_SAL_PROTO_UDP ? "UDP" : "TCP", remote_ip, atoi(remote_port));
@@ -291,32 +291,32 @@ static int ec600s_connect_establish(int id, sal_proto_t proto)
printf("establish socket %d on module fail\r\n", id);
return -3;
}
return 0;
}
static int ec600s_connect(const char *ip, const char *port, sal_proto_t proto)
{
int id;
id = tos_at_channel_alloc(AT_AGENT, ip, port);
if (id == -1) {
printf("at channel alloc fail\r\n");
return -1;
}
if (ec600s_connect_establish(id, proto) < 0) {
tos_at_channel_free(AT_AGENT, id);
return -2;
}
return id;
}
static int ec600s_connect_with_size(const char *ip, const char *port, sal_proto_t proto, size_t socket_buffer_size)
{
int id;
id = tos_at_channel_alloc_with_size(AT_AGENT, ip, port, socket_buffer_size);
if (id == -1) {
printf("at channel alloc fail\r\n");
@@ -327,7 +327,7 @@ static int ec600s_connect_with_size(const char *ip, const char *port, sal_proto_
tos_at_channel_free(AT_AGENT, id);
return -2;
}
return id;
}
@@ -348,29 +348,21 @@ int ec600s_send(int id, const void *buf, size_t len)
if (!tos_at_channel_is_working(AT_AGENT, id)) {
return -1;
}
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, NULL, 0, ">");
tos_at_cmd_exec_until(AT_AGENT, &echo, 1000, "AT+QISEND=%d,%d\r\n", id, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1;
}
tos_at_echo_create(&echo, NULL, 0, "SEND OK");
tos_at_raw_data_send_until(AT_AGENT, &echo, 10000, (uint8_t *)buf, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1;
}
tos_at_global_lock_post(AT_AGENT);
return len;
}
@@ -388,34 +380,26 @@ int ec600s_sendto(int id, char *ip, char *port, const void *buf, size_t len)
{
at_echo_t echo;
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, NULL, 0, ">");
tos_at_cmd_exec_until(AT_AGENT, &echo, 1000, "AT+QISEND=%d,%d\r\n", id, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1;
}
tos_at_echo_create(&echo, NULL, 0, "SEND OK");
tos_at_raw_data_send(AT_AGENT, &echo, 1000, (uint8_t *)buf, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1;
}
tos_at_global_lock_post(AT_AGENT);
return len;
}
static void ec600s_transparent_mode_exit(void)
{
at_echo_t echo;
tos_at_echo_create(&echo, NULL, 0, NULL);
tos_at_cmd_exec(AT_AGENT, &echo, 500, "+++");
}
@@ -423,7 +407,7 @@ static void ec600s_transparent_mode_exit(void)
static int ec600s_close(int id)
{
at_echo_t echo;
ec600s_transparent_mode_exit();
tos_at_echo_create(&echo, NULL, 0, NULL);
@@ -467,7 +451,7 @@ __STATIC__ void ec600s_incoming_data_process(void)
+QIURC: "recv",<sockid>,<datalen>
<data content>
*/
while (1) {
if (tos_at_uart_read(AT_AGENT, &data, 1) != 1) {
return;
@@ -492,7 +476,7 @@ __STATIC__ void ec600s_incoming_data_process(void)
if (tos_at_uart_read(AT_AGENT, &data, 1) != 1) {
return;
}
do {
#if !defined(MIN)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
@@ -529,7 +513,7 @@ __STATIC__ void ec600s_domain_data_process(void)
if (data == '0') {
return;
}
if (data == '\"') {
/* start parser domain */
while (1) {
@@ -595,7 +579,7 @@ sal_module_t sal_module_ec600s = {
int ec600s_sal_init(hal_uart_port_t uart_port)
{
if (tos_at_init(AT_AGENT, "ec600s_at", ec600s_at_parse_task_stk,
uart_port, ec600s_at_event,
sizeof(ec600s_at_event) / sizeof(ec600s_at_event[0])) != 0) {
@@ -608,7 +592,7 @@ int ec600s_sal_init(hal_uart_port_t uart_port)
if (tos_sal_module_init() != 0) {
return -1;
}
return 0;
}
@@ -623,7 +607,7 @@ int ec600s_sal_deinit()
tos_sal_module_register_default();
tos_at_deinit(AT_AGENT);
return 0;
}

View File

@@ -105,12 +105,15 @@ int esp8266_join_ap(const char *ssid, const char *pwd)
{
int try = 0;
at_echo_t echo;
char echo_buffer[128];
tos_at_echo_create(&echo, NULL, 0, NULL);
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 15000, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
tos_at_cmd_exec(AT_AGENT, &echo, 20000, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
if (echo.status == AT_ECHO_STATUS_OK) {
return 0;
if (strstr(echo_buffer, "WIFI GOT IP")) {
return 0;
}
}
}
return -1;
@@ -200,10 +203,6 @@ static int esp8266_send(int id, const void *buf, size_t len)
return -1;
}
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), ">");
#if TOS_CFG_MODULE_SINGLE_LINK_EN > 0u
tos_at_cmd_exec_until(&echo, 5000,
@@ -218,7 +217,6 @@ static int esp8266_send(int id, const void *buf, size_t len)
tos_at_channel_set_broken(AT_AGENT, id);
}
tos_at_global_lock_post(AT_AGENT);
return -1;
}
@@ -234,11 +232,9 @@ static int esp8266_send(int id, const void *buf, size_t len)
tos_at_channel_set_broken(AT_AGENT, id);
}
tos_at_global_lock_post(AT_AGENT);
return -1;
}
tos_at_global_lock_post(AT_AGENT);
return len;
}
@@ -251,10 +247,6 @@ static int esp8266_sendto(int id, char *ip, char *port, const void *buf, size_t
return -1;
}
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), ">");
if (ip && port) {
@@ -280,7 +272,6 @@ static int esp8266_sendto(int id, char *ip, char *port, const void *buf, size_t
tos_at_channel_set_broken(AT_AGENT, id);
}
tos_at_global_lock_post(AT_AGENT);
return -1;
}
@@ -296,11 +287,9 @@ static int esp8266_sendto(int id, char *ip, char *port, const void *buf, size_t
tos_at_channel_set_broken(AT_AGENT, id);
}
tos_at_global_lock_post(AT_AGENT);
return -1;
}
tos_at_global_lock_post(AT_AGENT);
return len;
}
@@ -317,9 +306,9 @@ static int esp8266_recvfrom(int id, void *buf, size_t len)
static int esp8266_close(int id)
{
at_echo_t echo;
tos_at_echo_create(&echo, NULL, 0, NULL);
#if TOS_CFG_MODULE_SINGLE_LINK_EN > 0u
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CIPCLOSE\r\n");
#else
@@ -441,7 +430,7 @@ __STATIC__ void esp8266_incoming_data_process(void)
if (tos_at_uart_read(AT_AGENT, buffer, read_len) != read_len) {
return;
}
//delay has two reason, wait for the data to be cached and untrigger scheduling
tos_stopwatch_delay(200);
@@ -501,7 +490,7 @@ int esp8266_sal_deinit()
tos_sal_module_register_default();
tos_at_deinit(AT_AGENT);
return 0;
}

View File

@@ -25,8 +25,8 @@
#define TOS_VERSION_MAJOR 0x02
#define TOS_VERSION_MINOR 0x05
#define TOS_VERSION_PATCH 0x01
#define TOS_VERSION "2.5.1"
#define TOS_VERSION_PATCH 0x02
#define TOS_VERSION "2.5.2"
#endif /* _TOS_VERSION_H_ */

View File

@@ -140,22 +140,26 @@ typedef struct at_agent_st {
k_task_t parser;
at_cache_t recv_cache;
/* protected the AT agent, so only one AT instruction is executing any one time. */
k_mutex_t global_lock;
char *cmd_buf;
k_mutex_t cmd_buf_lock;
/* global_lock has protected the at agent, so cmd buf lock is unnecessary,
the code will be removed in next version. */
// k_mutex_t cmd_buf_lock;
hal_uart_t uart;
k_mutex_t uart_tx_lock;
// k_mutex_t uart_rx_lock;
#if AT_INPUT_TYPE_FRAME_EN
k_mail_q_t uart_rx_frame_mail;
uint8_t *uart_rx_frame_mail_buffer;
uint16_t fifo_available_len;
#else
k_sem_t uart_rx_sem;
#if AT_INPUT_SIMULATE_IDLE_EN
k_timer_t idle_check_timer;
#endif /* AT_INPUT_SIMULATE_IDLE_EN */
@@ -329,7 +333,7 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
* @brief De-initialize the at framework.
*
* @param[in] at_agent pointer to the at agent struct.
*
*
* @attention None
*
* @return

View File

@@ -14,7 +14,7 @@
* as the other licenses applicable to the third-party components included
* within TencentOS.
*---------------------------------------------------------------------------*/
/*
Note:
If you find that the AT framework occasionally loses characters,
@@ -46,11 +46,11 @@ __STATIC__ int at_uart_getchar_from_fifo(at_agent_t *at_agent, uint8_t *data)
{
TOS_CPU_CPSR_ALLOC();
k_err_t err;
TOS_CPU_INT_DISABLE();
err = tos_chr_fifo_pop(&at_agent->uart_rx_fifo, data);
TOS_CPU_INT_ENABLE();
return err;
}
@@ -79,30 +79,30 @@ __STATIC__ int at_uart_getchar(at_agent_t *at_agent, uint8_t *data, k_tick_t tim
return -1;
}
}
if (at_uart_getchar_from_fifo(at_agent, data) != K_ERR_NONE) {
return -1;
}
return 0;
#else
tos_stopwatch_delay(1);
if (tos_sem_pend(&at_agent->uart_rx_sem, timeout) != K_ERR_NONE) {
return -1;
}
/*
the uart_rx_fifo is only read by at_parser task,
and it will be written in usart interrupt handler,
so it is more effective to use critical sections.
*/
// if (tos_mutex_pend(&at_agent->uart_rx_lock) != K_ERR_NONE) {
// return -1;
// }
if (at_uart_getchar_from_fifo(at_agent, data) != K_ERR_NONE) {
return -1;
}
@@ -274,7 +274,7 @@ __STATIC__ at_parse_status_t at_uart_line_parse(at_agent_t *at_agent)
recv_cache->buffer[recv_cache->buffer_size - 1] = '\0';
return AT_PARSE_STATUS_OVERFLOW;
}
if (at_get_event(at_agent) != K_NULL) {
return AT_PARSE_STATUS_EVENT;
}
@@ -282,9 +282,9 @@ __STATIC__ at_parse_status_t at_uart_line_parse(at_agent_t *at_agent)
if (at_is_echo_expect(at_agent)) {
return AT_PARSE_STATUS_EXPECT;
}
AT_LOG("recv_cache:[%s](%d)\r\n", recv_cache->buffer, recv_cache->recv_len);
if (strstr((char*)recv_cache->buffer, "OK")) {
return AT_PARSE_STATUS_OK;
} else if (strstr((char*)recv_cache->buffer, "FAIL")) {
@@ -344,11 +344,11 @@ __STATIC__ void at_parser(void *arg)
recv_cache = &at_agent->recv_cache;
while (K_TRUE) {
at_parse_status = at_uart_line_parse(at_agent);
AT_LOG("at line parser end!(%d)\r\n", at_parse_status);
tos_kprintln("--->%s", recv_cache->buffer);
if (at_parse_status == AT_PARSE_STATUS_OVERFLOW) {
@@ -368,7 +368,7 @@ __STATIC__ void at_parser(void *arg)
if (!at_echo) {
continue;
}
if (at_echo->buffer) {
at_echo_buffer_copy(recv_cache, at_echo);
}
@@ -467,16 +467,24 @@ __API__ int tos_at_raw_data_send(at_agent_t *at_agent, at_echo_t *echo, uint32_t
{
int ret = 0;
if (echo) {
at_echo_attach(at_agent, echo);
if (!echo) {
return -1;
}
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
at_echo_attach(at_agent, echo);
ret = at_uart_send(at_agent, buf, size, 0xFFFF);
tos_task_delay(tos_millisec2tick(timeout));
at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret;
}
@@ -488,7 +496,12 @@ __API__ int tos_at_raw_data_send_until(at_agent_t *at_agent, at_echo_t *echo, ui
return -1;
}
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) {
tos_at_global_lock_post(at_agent);
return -1;
}
echo->__is_expecting = K_TRUE;
@@ -504,6 +517,8 @@ __API__ int tos_at_raw_data_send_until(at_agent_t *at_agent, at_echo_t *echo, ui
at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret;
}
@@ -511,9 +526,9 @@ __STATIC__ int at_cmd_do_exec(at_agent_t *at_agent, const char *format, va_list
{
size_t cmd_len = 0;
if (tos_mutex_pend(&at_agent->cmd_buf_lock) != K_ERR_NONE) {
return -1;
}
// if (tos_mutex_pend(&at_agent->cmd_buf_lock) != K_ERR_NONE) {
// return -1;
// }
cmd_len = vsnprintf(at_agent->cmd_buf, AT_CMD_BUFFER_SIZE, format, args);
@@ -521,7 +536,7 @@ __STATIC__ int at_cmd_do_exec(at_agent_t *at_agent, const char *format, va_list
at_uart_send(at_agent, (uint8_t *)at_agent->cmd_buf, cmd_len, 0xFFFF);
tos_mutex_post(&at_agent->cmd_buf_lock);
// tos_mutex_post(&at_agent->cmd_buf_lock);
return 0;
}
@@ -530,23 +545,29 @@ __API__ int tos_at_cmd_exec(at_agent_t *at_agent, at_echo_t *echo, uint32_t time
{
int ret = 0;
va_list args;
if (!echo) {
return -1;
}
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
if (tos_sem_create(&echo->__status_set_notify, 0) != K_ERR_NONE) {
tos_at_global_lock_post(at_agent);
return -1;
}
at_echo_attach(at_agent, echo);
va_start(args, cmd);
ret = at_cmd_do_exec(at_agent, cmd, args);
va_end(args);
if (ret != 0) {
at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return -1;
}
@@ -558,6 +579,8 @@ __API__ int tos_at_cmd_exec(at_agent_t *at_agent, at_echo_t *echo, uint32_t time
at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret;
}
@@ -570,7 +593,12 @@ __API__ int tos_at_cmd_exec_until(at_agent_t *at_agent, at_echo_t *echo, uint32_
return -1;
}
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) {
tos_at_global_lock_post(at_agent);
return -1;
}
echo->__is_expecting = K_TRUE;
@@ -582,6 +610,7 @@ __API__ int tos_at_cmd_exec_until(at_agent_t *at_agent, at_echo_t *echo, uint32_
if (ret != 0) {
at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return -1;
}
@@ -593,6 +622,8 @@ __API__ int tos_at_cmd_exec_until(at_agent_t *at_agent, at_echo_t *echo, uint32_
at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret;
}
@@ -696,7 +727,7 @@ __API__ int tos_at_channel_read_timed(at_agent_t *at_agent, int channel_id, uint
remain_tick = tos_millisec2tick(timeout);
tos_stopwatch_countdown(&data_channel->timer, remain_tick);
while (!tos_stopwatch_is_expired(&data_channel->timer)) {
remain_tick = tos_stopwatch_remain(&data_channel->timer);
if (remain_tick == (k_tick_t)0u) {
@@ -710,7 +741,7 @@ __API__ int tos_at_channel_read_timed(at_agent_t *at_agent, int channel_id, uint
read_len = tos_chr_fifo_pop_stream(&data_channel->rx_fifo, buffer + total_read_len, buffer_len - total_read_len);
tos_mutex_post(&data_channel->rx_lock);
if (read_len == 0) {
remain_tick = tos_stopwatch_remain(&data_channel->timer);
tos_sem_pend(&data_channel->rx_sem, remain_tick);
@@ -752,13 +783,13 @@ __API__ int tos_at_channel_write(at_agent_t *at_agent, int channel_id, uint8_t *
__STATIC_INLINE__ int at_channel_construct(at_data_channel_t *data_channel, const char *ip, const char *port, size_t socket_buffer_size)
{
uint8_t *fifo_buffer = K_NULL;
fifo_buffer = tos_mmheap_alloc(socket_buffer_size);
if (!fifo_buffer) {
return -1;
}
if (tos_sem_create_max(&data_channel->rx_sem, 0, 1) != K_ERR_NONE) {
goto errout;
}
@@ -860,7 +891,7 @@ __API__ int tos_at_channel_free(at_agent_t *at_agent, int channel_id)
if (!data_channel) {
return -1;
}
tos_sem_destroy(&data_channel->rx_sem);
tos_mutex_destroy(&data_channel->rx_lock);
@@ -957,7 +988,7 @@ __STATIC__ void tos_at_uart_input_notify(at_agent_t *at_agent)
}
__STATIC__ void idle_check_timer_callback(void *args)
{
{
at_agent_t *at_agent = (at_agent_t *)args;
tos_at_uart_input_notify(at_agent);
}
@@ -987,9 +1018,9 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
}
at_agent->cmd_buf = (char *)buffer;
if (tos_mutex_create(&at_agent->cmd_buf_lock) != K_ERR_NONE) {
goto errout1;
}
// if (tos_mutex_create(&at_agent->cmd_buf_lock) != K_ERR_NONE) {
// goto errout1;
// }
if (at_recv_cache_init(at_agent) != 0) {
goto errout2;
@@ -1000,9 +1031,9 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
if (!buffer) {
goto errout3;
}
at_agent->uart_rx_frame_mail_buffer = (uint8_t *)buffer;
if (tos_mail_q_create(&at_agent->uart_rx_frame_mail, buffer, AT_FRAME_LEN_MAIL_MAX, sizeof(at_frame_len_mail_t)) != K_ERR_NONE) {
goto errout4;
}
@@ -1019,22 +1050,22 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
if (tos_mutex_create(&at_agent->uart_tx_lock) != K_ERR_NONE) {
goto errout6;
}
if (tos_mutex_create(&at_agent->global_lock) != K_ERR_NONE) {
goto errout7;
}
#if AT_INPUT_SIMULATE_IDLE_EN
if (tos_timer_create(&at_agent->idle_check_timer, SIMULATE_IDLE_DEFAULT_TIME,
0, idle_check_timer_callback, at_agent, TOS_OPT_TIMER_ONESHOT) != K_ERR_NONE) {
goto errout8;
}
#endif /* AT_INPUT_SIMULATE_IDLE_EN */
#endif /* AT_INPUT_SIMULATE_IDLE_EN */
if (tos_hal_uart_init(&at_agent->uart, uart_port) != 0) {
goto errout9;
}
if (tos_task_create(&at_agent->parser, task_name, at_parser,
at_agent, AT_PARSER_TASK_PRIO, stk,
AT_PARSER_TASK_STACK_SIZE, 0) != K_ERR_NONE) {
@@ -1044,18 +1075,18 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
return 0;
errout10:
tos_hal_uart_deinit(&at_agent->uart);
errout9:
#if AT_INPUT_SIMULATE_IDLE_EN
tos_timer_destroy(&at_agent->idle_check_timer);
tos_timer_destroy(&at_agent->idle_check_timer);
errout8:
#endif /* AT_INPUT_SIMULATE_IDLE_EN */
tos_mutex_destroy(&at_agent->global_lock);
errout7:
tos_mutex_destroy(&at_agent->uart_tx_lock);
errout6:
// tos_mutex_destroy(&at_agent->uart_rx_lock);
@@ -1065,7 +1096,7 @@ errout6:
#else
tos_sem_destroy(&at_agent->uart_rx_sem);
#endif /* AT_INPUT_TYPE_FRAME_EN */
#if AT_INPUT_TYPE_FRAME_EN
errout4:
tos_mmheap_free(at_agent->uart_rx_frame_mail_buffer);
@@ -1076,9 +1107,9 @@ errout3:
at_recv_cache_deinit(at_agent);
errout2:
tos_mutex_destroy(&at_agent->cmd_buf_lock);
// tos_mutex_destroy(&at_agent->cmd_buf_lock);
errout1:
//errout1:
tos_mmheap_free(at_agent->cmd_buf);
at_agent->cmd_buf = K_NULL;
@@ -1093,15 +1124,15 @@ errout0:
__API__ void tos_at_deinit(at_agent_t *at_agent)
{
tos_task_destroy(&at_agent->parser);
tos_hal_uart_deinit(&at_agent->uart);
tos_mutex_destroy(&at_agent->global_lock);
tos_mutex_destroy(&at_agent->uart_tx_lock);
//tos_mutex_destroy(&at_agent->uart_tx_lock);
#if AT_INPUT_SIMULATE_IDLE_EN
tos_timer_destroy(&at_agent->idle_check_timer);
#endif /* AT_INPUT_SIMULATE_IDLE_EN */
@@ -1113,10 +1144,10 @@ __API__ void tos_at_deinit(at_agent_t *at_agent)
#else
tos_sem_destroy(&at_agent->uart_rx_sem);
#endif /* AT_INPUT_TYPE_FRAME_EN */
at_recv_cache_deinit(at_agent);
tos_mutex_destroy(&at_agent->cmd_buf_lock);
// tos_mutex_destroy(&at_agent->cmd_buf_lock);
tos_mmheap_free(at_agent->cmd_buf);
at_agent->cmd_buf = K_NULL;
@@ -1136,12 +1167,12 @@ __API__ void tos_at_uart_input_frame(at_agent_t *at_agent, uint8_t *pdata, uint1
{
int ret;
at_frame_len_mail_t at_frame_len_mail;
ret = tos_chr_fifo_push_stream(&at_agent->uart_rx_fifo, pdata, len);
if (ret != len) {
return;
}
at_frame_len_mail.frame_len = len;
tos_mail_q_post(&at_agent->uart_rx_frame_mail, &at_frame_len_mail, sizeof(at_frame_len_mail_t));
}