Merge pull request #770 from kwagyeman/kwabena/wifi_performance_max

Improve WiFi performance by 20X
This commit is contained in:
Ibrahim Abd Elkader 2020-04-29 02:17:25 +02:00 committed by GitHub
commit 0f0ff4b247
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 20 deletions

View File

@ -502,7 +502,12 @@ static mp_uint_t py_winc_socket_sendto(mod_network_socket_obj_t *socket,
{
MAKE_SOCKADDR(addr, ip, port)
int ret = winc_socket_sendto(socket->fd, buf, len, &addr, socket->timeout);
if (ret < 0) {
if (ret == SOCK_ERR_TIMEOUT) {
// The socket is Not closed on timeout when calling
// WINC1500 functions that actually accept a timeout.
*_errno = MP_ETIMEDOUT;
return 0;
} else if (ret < 0) {
*_errno = ret;
py_winc_socket_close(socket);
return -1;

View File

@ -410,6 +410,7 @@ static int winc_async_request(uint8_t msg_type, void *ret, uint32_t timeout)
// Wait for async request to finish.
while (async_request_done == false) {
__WFI();
// Handle pending events from network controller.
m2m_wifi_handle_events(NULL);
// timeout == 0 in blocking mode.
@ -537,6 +538,7 @@ int winc_connect(const char *ssid, uint8_t security, const char *key, uint16_t c
async_request_done = false;
while (async_request_done == false) {
__WFI();
// Handle pending events from network controller.
m2m_wifi_handle_events(NULL);
}
@ -602,6 +604,7 @@ int winc_wait_for_sta(uint32_t *sta_ip, uint32_t timeout)
{
uint32_t tick_start = HAL_GetTick();
while (connected_sta_ip == 0) {
__WFI();
// Handle pending events from network controller.
m2m_wifi_handle_events(NULL);
if (timeout && ((HAL_GetTick() - tick_start) >= timeout)) {
@ -637,6 +640,7 @@ int winc_netinfo(winc_netinfo_t *netinfo)
m2m_wifi_get_connection_info();
while (async_request_done == false) {
__WFI();
// Handle pending events from network controller.
m2m_wifi_handle_events(NULL);
}
@ -654,6 +658,7 @@ int winc_scan(winc_scan_callback_t cb, void *arg)
m2m_wifi_request_scan(M2M_WIFI_CH_ALL);
while (async_request_done == false) {
__WFI();
// Handle pending events from network controller.
m2m_wifi_handle_events(NULL);
}
@ -671,6 +676,7 @@ int winc_get_rssi()
m2m_wifi_req_curr_rssi();
while (async_request_done == false) {
__WFI();
// Handle pending events from network controller.
m2m_wifi_handle_events(NULL);
}
@ -827,21 +833,19 @@ int winc_socket_send(int fd, const uint8_t *buf, uint32_t len, uint32_t timeout)
int bytes = 0;
while (bytes < len) {
// Do async request (clean out any messages - but ignore them).
int async_ret;
async_request_data = &async_ret;
async_request_done = false;
async_request_type = SOCKET_MSG_SEND;
m2m_wifi_handle_events(NULL);
// Split the packet into smaller ones.
int n = MIN((len - bytes), SOCKET_BUFFER_MAX_LENGTH);
int ret = WINC1500_EXPORT(send)(fd, (uint8_t*)buf + bytes, n, 0);
if (ret == SOCK_ERR_NO_ERROR) {
// Do async request
int async_ret;
ret = winc_async_request(SOCKET_MSG_SEND, &async_ret, timeout);
// Check sent bytes returned from async request.
if (ret != SOCK_ERR_NO_ERROR || async_ret <= 0) {
return (ret != SOCK_ERR_NO_ERROR) ? ret : async_ret;
}
bytes += async_ret;
bytes += n;
} else if (ret == SOCK_ERR_BUFFER_FULL) {
// timeout == 0 in blocking mode.
if (timeout && ((HAL_GetTick() - tick_start) >= timeout)) {
@ -891,20 +895,18 @@ int winc_socket_sendto(int fd, const uint8_t *buf, uint32_t len, sockaddr *addr,
int bytes = 0;
while (bytes < len) {
// Do async request (clean out any messages - but ignore them).
int async_ret;
async_request_data = &async_ret;
async_request_done = false;
async_request_type = SOCKET_MSG_SENDTO;
m2m_wifi_handle_events(NULL);
// Split the packet into smaller ones.
int n = MIN((len - bytes), SOCKET_BUFFER_MAX_LENGTH);
int ret = WINC1500_EXPORT(sendto)(fd, (uint8_t*)buf + bytes, n, 0, addr, sizeof(*addr));
if (ret == SOCK_ERR_NO_ERROR) {
// Do async request
int async_ret; // sendto always returns 0.
ret = winc_async_request(SOCKET_MSG_SENDTO, &async_ret, timeout);
// Check sent bytes returned from async request.
if (ret != SOCK_ERR_NO_ERROR || async_ret < 0) {
return (ret != SOCK_ERR_NO_ERROR) ? ret : async_ret;
}
bytes += n;
} else if (ret == SOCK_ERR_BUFFER_FULL) {
// timeout == 0 in blocking mode.