diff options
| author | tangweikang <[email protected]> | 2019-08-30 16:11:46 +0800 |
|---|---|---|
| committer | tangweikang <[email protected]> | 2019-08-30 16:11:46 +0800 |
| commit | 0f74ee7e20cf8c54ec967da7f6ac1ab472a723a2 (patch) | |
| tree | 7f22179e6b844e1106f6bf30a606cb1d9620ba7a /components | |
| parent | b76d3dac8a92b36993169e5d38a6960b3210af04 (diff) | |
| parent | 779d86f1daba7e7118e58419e669d4c2d91968b1 (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.c | 10 | ||||
| -rw-r--r-- | components/libc/compilers/common/time.c | 40 | ||||
| -rw-r--r-- | components/net/at/include/at.h | 4 | ||||
| -rw-r--r-- | components/net/at/src/at_cli.c | 10 | ||||
| -rw-r--r-- | components/net/at/src/at_server.c | 99 | ||||
| -rw-r--r-- | components/net/netdev/src/netdev.c | 24 |
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; |
