Skip to content

Commit 495e7cf

Browse files
author
danicampora
committed
cc3200: Improve robustness of WLAN during sleep modes.
1 parent f5248a0 commit 495e7cf

6 files changed

Lines changed: 42 additions & 19 deletions

File tree

cc3200/mods/modusocket.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,10 @@ void modusocket_enter_sleep (void) {
106106
}
107107
}
108108

109-
// wait for any of the sockets to become ready...
110-
sl_Select(maxfd + 1, &socketset, NULL, NULL, NULL);
109+
if (maxfd > 0) {
110+
// wait for any of the sockets to become ready...
111+
sl_Select(maxfd + 1, &socketset, NULL, NULL, NULL);
112+
}
111113
}
112114

113115
void modusocket_close_all_user_sockets (void) {

cc3200/mods/modwlan.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ STATIC wlan_obj_t wlan_obj = {
149149
.ssid = MICROPY_PORT_WLAN_AP_SSID,
150150
.key = MICROPY_PORT_WLAN_AP_KEY,
151151
.mac = {0},
152-
.ssid_o = {0},
153-
.bssid = {0},
152+
//.ssid_o = {0},
153+
//.bssid = {0},
154154
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
155155
.servers_enabled = false,
156156
#endif
@@ -210,11 +210,11 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
210210
{
211211
case SL_WLAN_CONNECT_EVENT:
212212
{
213-
slWlanConnectAsyncResponse_t *pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
213+
//slWlanConnectAsyncResponse_t *pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
214214
// copy the new connection data
215-
memcpy(wlan_obj.bssid, pEventData->bssid, SL_BSSID_LENGTH);
216-
memcpy(wlan_obj.ssid_o, pEventData->ssid_name, pEventData->ssid_len);
217-
wlan_obj.ssid_o[pEventData->ssid_len] = '\0';
215+
//memcpy(wlan_obj.bssid, pEventData->bssid, SL_BSSID_LENGTH);
216+
//memcpy(wlan_obj.ssid_o, pEventData->ssid_name, pEventData->ssid_len);
217+
//wlan_obj.ssid_o[pEventData->ssid_len] = '\0';
218218
SET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
219219
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
220220
// we must reset the servers in case that the last connection
@@ -228,15 +228,16 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
228228
CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED);
229229
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
230230
servers_reset();
231+
servers_wlan_cycle_power();
231232
#endif
232233
break;
233234
case SL_WLAN_STA_CONNECTED_EVENT:
234235
{
235-
slPeerInfoAsyncResponse_t *pEventData = &pWlanEvent->EventData.APModeStaConnected;
236+
//slPeerInfoAsyncResponse_t *pEventData = &pWlanEvent->EventData.APModeStaConnected;
236237
// get the mac address and name of the connected device
237-
memcpy(wlan_obj.bssid, pEventData->mac, SL_BSSID_LENGTH);
238-
memcpy(wlan_obj.ssid_o, pEventData->go_peer_device_name, pEventData->go_peer_device_name_len);
239-
wlan_obj.ssid_o[pEventData->go_peer_device_name_len] = '\0';
238+
//memcpy(wlan_obj.bssid, pEventData->mac, SL_BSSID_LENGTH);
239+
//memcpy(wlan_obj.ssid_o, pEventData->go_peer_device_name, pEventData->go_peer_device_name_len);
240+
//wlan_obj.ssid_o[pEventData->go_peer_device_name_len] = '\0';
240241
SET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
241242
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
242243
// we must reset the servers in case that the last connection
@@ -249,6 +250,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
249250
CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
250251
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
251252
servers_reset();
253+
servers_wlan_cycle_power();
252254
#endif
253255
break;
254256
case SL_WLAN_P2P_DEV_FOUND_EVENT:
@@ -547,15 +549,21 @@ void wlan_set_current_time (uint32_t seconds_since_2000) {
547549
sl_DevSet(SL_DEVICE_GENERAL_CONFIGURATION, SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME, sizeof(SlDateTime_t), (_u8 *)(&sl_datetime));
548550
}
549551

552+
void wlan_off_on (void) {
553+
// no need to lock the WLAN object on every API call since the servers and the MicroPtyhon
554+
// task have the same priority
555+
wlan_reenable(wlan_obj.mode);
556+
}
557+
550558
//*****************************************************************************
551559
// DEFINE STATIC FUNCTIONS
552560
//*****************************************************************************
553561

554562
STATIC void wlan_clear_data (void) {
555563
CLR_STATUS_BIT_ALL(wlan_obj.status);
556564
wlan_obj.ip = 0;
557-
memset(wlan_obj.ssid_o, 0, sizeof(wlan_obj.ssid));
558-
memset(wlan_obj.bssid, 0, sizeof(wlan_obj.bssid));
565+
//memset(wlan_obj.ssid_o, 0, sizeof(wlan_obj.ssid));
566+
//memset(wlan_obj.bssid, 0, sizeof(wlan_obj.bssid));
559567
}
560568

561569
STATIC void wlan_reenable (SlWlanMode_t mode) {

cc3200/mods/modwlan.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ extern void wlan_get_mac (uint8_t *macAddress);
9595
extern void wlan_get_ip (uint32_t *ip);
9696
extern bool wlan_is_connected (void);
9797
extern void wlan_set_current_time (uint32_t seconds_since_2000);
98+
extern void wlan_off_on (void);
9899

99100
extern int wlan_gethostbyname(const char *name, mp_uint_t len, uint8_t *out_ip, uint8_t family);
100101
extern int wlan_socket_socket(mod_network_socket_obj_t *s, int *_errno);

cc3200/mods/pybtimer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *tim, mp_uint_t n_args, co
322322
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
323323
}
324324

325-
STATIC mp_obj_t pyb_timer_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
325+
STATIC mp_obj_t pyb_timer_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
326326
// check arguments
327327
mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
328328

cc3200/serverstask.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
#include "pybwdt.h"
4040
#include "modusocket.h"
4141
#include "mpexception.h"
42-
42+
#include "modnetwork.h"
43+
#include "modwlan.h"
4344

4445
/******************************************************************************
4546
DEFINE PRIVATE TYPES
@@ -50,13 +51,13 @@ typedef struct {
5051
bool do_disable;
5152
bool do_enable;
5253
bool do_reset;
54+
bool do_wlan_cycle_power;
5355
} servers_data_t;
5456

5557
/******************************************************************************
5658
DECLARE PRIVATE DATA
5759
******************************************************************************/
58-
static servers_data_t servers_data = {.timeout = SERVERS_DEF_TIMEOUT_MS, .enabled = false, .do_disable = false,
59-
.do_enable = false, .do_reset = false};
60+
static servers_data_t servers_data = {.timeout = SERVERS_DEF_TIMEOUT_MS};
6061
static volatile bool sleep_sockets = false;
6162

6263
/******************************************************************************
@@ -120,10 +121,16 @@ void TASK_Servers (void *pvParameters) {
120121
}
121122

122123
if (sleep_sockets) {
123-
sleep_sockets = false;
124124
pybwdt_srv_sleeping(true);
125125
modusocket_enter_sleep();
126126
pybwdt_srv_sleeping(false);
127+
mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS * 2);
128+
if (servers_data.do_wlan_cycle_power) {
129+
servers_data.do_wlan_cycle_power = false;
130+
wlan_off_on();
131+
}
132+
sleep_sockets = false;
133+
127134
}
128135

129136
// set the alive flag for the wdt
@@ -152,6 +159,10 @@ void servers_reset (void) {
152159
servers_data.do_reset = true;
153160
}
154161

162+
void servers_wlan_cycle_power (void) {
163+
servers_data.do_wlan_cycle_power = true;
164+
}
165+
155166
bool servers_are_enabled (void) {
156167
return servers_data.enabled;
157168
}

cc3200/serverstask.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ extern void TASK_Servers (void *pvParameters);
6262
extern void servers_start (void);
6363
extern void servers_stop (void);
6464
extern void servers_reset (void);
65+
extern void servers_wlan_cycle_power (void);
6566
extern bool servers_are_enabled (void);
6667
extern void servers_close_socket (int16_t *sd);
6768
extern void servers_set_login (char *user, char *pass);

0 commit comments

Comments
 (0)