summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authortangweikang <[email protected]>2019-08-30 16:11:46 +0800
committertangweikang <[email protected]>2019-08-30 16:11:46 +0800
commit0f74ee7e20cf8c54ec967da7f6ac1ab472a723a2 (patch)
tree7f22179e6b844e1106f6bf30a606cb1d9620ba7a /components
parentb76d3dac8a92b36993169e5d38a6960b3210af04 (diff)
parent779d86f1daba7e7118e58419e669d4c2d91968b1 (diff)
Merge branch 'master' of https://github.com/RT-Thread/rt-thread into drv_encoder
# Conflicts: # components/drivers/misc/encoder.c
Diffstat (limited to 'components')
-rw-r--r--components/drivers/can/can.c10
-rw-r--r--components/libc/compilers/common/time.c40
-rw-r--r--components/net/at/include/at.h4
-rw-r--r--components/net/at/src/at_cli.c10
-rw-r--r--components/net/at/src/at_server.c99
-rw-r--r--components/net/netdev/src/netdev.c24
6 files changed, 135 insertions, 52 deletions
diff --git a/components/drivers/can/can.c b/components/drivers/can/can.c
index 48604993b9..3d60dbaa55 100644
--- a/components/drivers/can/can.c
+++ b/components/drivers/can/can.c
@@ -853,7 +853,10 @@ void rt_hw_can_isr(struct rt_can_device *can, int event)
level = rt_hw_interrupt_disable();
rx_length = can->hdr[hdr].msgs * sizeof(struct rt_can_msg);
rt_hw_interrupt_enable(level);
- can->hdr[hdr].filter.ind(&can->parent, can->hdr[hdr].filter.args, hdr, rx_length);
+ if (rx_length)
+ {
+ can->hdr[hdr].filter.ind(&can->parent, can->hdr[hdr].filter.args, hdr, rx_length);
+ }
}
else
#endif
@@ -867,7 +870,10 @@ void rt_hw_can_isr(struct rt_can_device *can, int event)
rx_length = rt_list_len(&rx_fifo->uselist)* sizeof(struct rt_can_msg);
rt_hw_interrupt_enable(level);
- can->parent.rx_indicate(&can->parent, rx_length);
+ if (rx_length)
+ {
+ can->parent.rx_indicate(&can->parent, rx_length);
+ }
}
}
break;
diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c
index 0ab9f6980e..ed7a232079 100644
--- a/components/libc/compilers/common/time.c
+++ b/components/libc/compilers/common/time.c
@@ -8,13 +8,10 @@
* 2019-08-21 zhangjun copy from minilibc
*/
-#if defined(__CC_ARM) || defined(__CLANG_ARM) || defined (__IAR_SYSTEMS_ICC__)
#include <time.h>
#include <rtthread.h>
-/* seconds per day */
-#define SPD 24*60*60
-
+#if !defined (__IAR_SYSTEMS_ICC__)
/* days per month -- nonleap! */
const short __spm[13] =
@@ -93,15 +90,7 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r)
return r;
}
-#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
-#if _DLIB_TIME_USES_64
-struct tm* __gmtime64(const time_t* t)
-#else
-struct tm* __gmtime32(const time_t* t)
-#endif
-#else
struct tm* gmtime(const time_t* t)
-#endif
{
static struct tm tmp;
return gmtime_r(t, &tmp);
@@ -113,29 +102,13 @@ struct tm* localtime_r(const time_t* t, struct tm* r)
return gmtime_r(t, r);
}
-#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
-#if _DLIB_TIME_USES_64
-struct tm* __localtime64(const time_t* t)
-#else
-struct tm* __localtime32(const time_t* t)
-#endif
-#else
struct tm* localtime(const time_t* t)
-#endif
{
static struct tm tmp;
return localtime_r(t, &tmp);
}
-#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
-#if _DLIB_TIME_USES_64
-time_t __mktime64(struct tm * const t)
-#else
-time_t __mktime32(struct tm * const t)
-#endif
-#else
time_t mktime(struct tm * const t)
-#endif
{
register time_t day;
register time_t i;
@@ -242,15 +215,7 @@ char* asctime(const struct tm *timeptr)
return asctime_r(timeptr, buf);
}
-#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
-#if _DLIB_TIME_USES_64
-char* __ctime64(const time_t *timep)
-#else
-char* __ctime32(const time_t *timep)
-#endif
-#else
char* ctime(const time_t *timep)
-#endif
{
return asctime(localtime(timep));
}
@@ -285,6 +250,8 @@ int _gettimeofday( struct timeval *tv, void *ignore)
}
#endif
+#endif /* __IAR_SYSTEMS_ICC__ */
+
/**
* Returns the current time.
*
@@ -340,4 +307,3 @@ RT_WEAK clock_t clock(void)
{
return rt_tick_get();
}
-#endif
diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h
index dc2abef353..a7a6aeca7a 100644
--- a/components/net/at/include/at.h
+++ b/components/net/at/include/at.h
@@ -96,7 +96,7 @@ struct at_server
rt_device_t device;
at_status_t status;
- char (*get_char)(void);
+ rt_err_t (*get_char)(struct at_server *server, char *ch, rt_int32_t timeout);
rt_bool_t echo_mode;
char recv_buffer[AT_SERVER_RECV_BUFF_LEN];
@@ -194,6 +194,8 @@ int at_server_init(void);
void at_server_printf(const char *format, ...);
void at_server_printfln(const char *format, ...);
void at_server_print_result(at_result_t result);
+rt_size_t at_server_send(at_server_t server, const char *buf, rt_size_t size);
+rt_size_t at_server_recv(at_server_t server, char *buf, rt_size_t size, rt_int32_t timeout);
/* AT server request arguments parse */
int at_req_parse_args(const char *req_args, const char *req_expr, ...);
diff --git a/components/net/at/src/at_cli.c b/components/net/at/src/at_cli.c
index 80af613fa6..e39a913357 100644
--- a/components/net/at/src/at_cli.c
+++ b/components/net/at/src/at_cli.c
@@ -100,6 +100,12 @@ void at_cli_deinit(void)
}
#ifdef AT_USING_SERVER
+static rt_err_t at_server_console_getchar(struct at_server *server, char *ch, rt_int32_t timeout)
+{
+ *ch = console_getchar();
+ return RT_EOK;
+}
+
static void server_cli_parser(void)
{
extern at_server_t at_get_server(void);
@@ -107,7 +113,7 @@ static void server_cli_parser(void)
at_server_t server = at_get_server();
rt_base_t int_lvl;
static rt_device_t device_bak;
- static char (*getchar_bak)(void);
+ static rt_err_t (*getchar_bak)(struct at_server *server, char *ch, rt_int32_t timeout);
static char endmark_back[AT_END_MARK_LEN];
/* backup server device and getchar function */
@@ -122,7 +128,7 @@ static void server_cli_parser(void)
/* setup server device as console device */
server->device = rt_console_get_device();
- server->get_char = console_getchar;
+ server->get_char = at_server_console_getchar;
memset(server->end_mark, 0x00, AT_END_MARK_LEN);
server->end_mark[0] = '\r';
diff --git a/components/net/at/src/at_server.c b/components/net/at/src/at_server.c
index 31f1bec96f..81d00951f5 100644
--- a/components/net/at/src/at_server.c
+++ b/components/net/at/src/at_server.c
@@ -167,6 +167,79 @@ void rt_at_server_print_all_cmd(void)
}
}
+/**
+ * Send data to AT Client by uart device.
+ *
+ * @param server current AT server object
+ * @param buf send data buffer
+ * @param size send fixed data size
+ *
+ * @return >0: send data size
+ * =0: send failed
+ */
+rt_size_t at_server_send(at_server_t server, const char *buf, rt_size_t size)
+{
+ RT_ASSERT(buf);
+
+ if (server == RT_NULL)
+ {
+ LOG_E("input AT Server object is NULL, please create or get AT Server object!");
+ return 0;
+ }
+
+ return rt_device_write(server->device, 0, buf, size);
+}
+
+/**
+ * AT Server receive fixed-length data.
+ *
+ * @param client current AT Server object
+ * @param buf receive data buffer
+ * @param size receive fixed data size
+ * @param timeout receive data timeout (ms)
+ *
+ * @note this function can only be used in execution function of AT commands
+ *
+ * @return >0: receive data size
+ * =0: receive failed
+ */
+rt_size_t at_server_recv(at_server_t server, char *buf, rt_size_t size, rt_int32_t timeout)
+{
+ rt_size_t read_idx = 0;
+ rt_err_t result = RT_EOK;
+ char ch = 0;
+
+ RT_ASSERT(buf);
+
+ if (server == RT_NULL)
+ {
+ LOG_E("input AT Server object is NULL, please create or get AT Server object!");
+ return 0;
+ }
+
+ while (1)
+ {
+ if (read_idx < size)
+ {
+ /* check get data value */
+ result = server->get_char(server, &ch, timeout);
+ if (result != RT_EOK)
+ {
+ LOG_E("AT Server receive failed, uart device get data error.");
+ return 0;
+ }
+
+ buf[read_idx++] = ch;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return read_idx;
+}
+
at_server_t at_get_server(void)
{
RT_ASSERT(at_server_local);
@@ -339,17 +412,21 @@ static rt_err_t at_cmd_get_name(const char *cmd_buffer, char *cmd_name)
return -RT_ERROR;
}
-static char at_server_gerchar(void)
+static rt_err_t at_server_gerchar(at_server_t server, char *ch, rt_int32_t timeout)
{
- char ch;
+ rt_err_t result = RT_EOK;
- while (rt_device_read(at_server_local->device, 0, &ch, 1) == 0)
+ while (rt_device_read(at_server_local->device, 0, ch, 1) == 0)
{
rt_sem_control(at_server_local->rx_notice, RT_IPC_CMD_RESET, RT_NULL);
- rt_sem_take(at_server_local->rx_notice, RT_WAITING_FOREVER);
+ result = rt_sem_take(at_server_local->rx_notice, rt_tick_from_millisecond(timeout));
+ if (result != RT_EOK)
+ {
+ return result;
+ }
}
- return ch;
+ return result;
}
static void server_parser(at_server_t server)
@@ -365,14 +442,24 @@ static void server_parser(at_server_t server)
RT_ASSERT(server);
RT_ASSERT(server->status != AT_STATUS_UNINITIALIZED);
- while (ESC_KEY != (ch = server->get_char()))
+ while (1)
{
+ server->get_char(server, &ch, RT_WAITING_FOREVER);
+ if (ESC_KEY == ch)
+ {
+ break;
+ }
+
if (server->echo_mode)
{
if (ch == AT_CMD_CR || (ch == AT_CMD_LF && last_ch != AT_CMD_CR))
{
at_server_printf("%c%c", AT_CMD_CR, AT_CMD_LF);
}
+ else if (ch == AT_CMD_LF)
+ {
+ // skip the end sign check
+ }
else if (ch == BACKSPACE_KEY || ch == DELECT_KEY)
{
if (server->cur_recv_len)
diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c
index bc2c55f727..ebdcbed36f 100644
--- a/components/net/netdev/src/netdev.c
+++ b/components/net/netdev/src/netdev.c
@@ -355,7 +355,7 @@ void netdev_set_default(struct netdev *netdev)
/* set default network interface device in the current network stack */
netdev->ops->set_default(netdev);
}
- LOG_D("Setting default network interface device name(%s) successfully.", netdev->name);
+ LOG_D("Setting default network interface device name(%s) successfully.", netdev->name);
}
}
@@ -1037,16 +1037,30 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size)
{
/* using first internet up status network interface device */
netdev = netdev_get_first_by_flags(NETDEV_FLAG_LINK_UP);
- if (netdev == RT_NULL || NETDEV_PING_IS_COMMONICABLE(netdev) == 0)
+ if (netdev == RT_NULL)
{
- rt_kprintf("ping: network interface device get error.\n");
+ rt_kprintf("ping: not found available network interface device.\n");
+ return -RT_ERROR;
+ }
+ else if (netdev->ops == RT_NULL || netdev->ops->ping == RT_NULL)
+ {
+ rt_kprintf("ping: network interface device(%s) not support ping feature.\n", netdev->name);
+ return -RT_ERROR;
+ }
+ else if (!netdev_is_up(netdev) || !netdev_is_link_up(netdev))
+ {
+ rt_kprintf("ping: network interface device(%s) status error.\n", netdev->name);
return -RT_ERROR;
}
}
for (index = 0; index < times; index++)
{
+ int delay_tick = 0;
+ rt_tick_t start_tick = 0;
+
rt_memset(&ping_resp, 0x00, sizeof(struct netdev_ping_resp));
+ start_tick = rt_tick_get();
ret = netdev->ops->ping(netdev, (const char *)target_name, size, NETDEV_PING_RECV_TIMEO, &ping_resp);
if (ret == -RT_ETIMEOUT)
{
@@ -1073,7 +1087,9 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size)
}
}
- rt_thread_mdelay(NETDEV_PING_DELAY);
+ /* if the response time is more than NETDEV_PING_DELAY, no nead to delay */
+ delay_tick = ((rt_tick_get() - start_tick) > NETDEV_PING_DELAY) || (index == times) ? 0 : NETDEV_PING_DELAY;
+ rt_thread_delay(delay_tick);
}
return RT_EOK;