mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-22 11:30:01 +08:00
Merge branch 'master' of https://github.com/RT-Thread/rt-thread into drv_encoder
# Conflicts: # components/drivers/misc/encoder.c
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, ...);
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user