@@ -82,7 +82,7 @@ static std::list<WiFiEventHandler> sCbEventList;
82
82
bool ESP8266WiFiGenericClass::_persistent = true ;
83
83
WiFiMode_t ESP8266WiFiGenericClass::_forceSleepLastMode = WIFI_OFF;
84
84
85
- ESP8266WiFiGenericClass::ESP8266WiFiGenericClass ()
85
+ ESP8266WiFiGenericClass::ESP8266WiFiGenericClass ()
86
86
{
87
87
wifi_set_event_handler_cb ((wifi_event_handler_cb_t ) &ESP8266WiFiGenericClass::_eventCallback);
88
88
}
@@ -214,7 +214,7 @@ WiFiEventHandler ESP8266WiFiGenericClass::onSoftAPModeProbeRequestReceived(std::
214
214
* callback for WiFi events
215
215
* @param arg
216
216
*/
217
- void ESP8266WiFiGenericClass::_eventCallback (void * arg)
217
+ void ESP8266WiFiGenericClass::_eventCallback (void * arg)
218
218
{
219
219
System_Event_t* event = reinterpret_cast <System_Event_t*>(arg);
220
220
DEBUG_WIFI (" wifi evt: %d\n " , event->event );
@@ -249,8 +249,71 @@ int32_t ESP8266WiFiGenericClass::channel(void) {
249
249
* @param type sleep_type_t
250
250
* @return bool
251
251
*/
252
- bool ESP8266WiFiGenericClass::setSleepMode (WiFiSleepType_t type) {
253
- return wifi_set_sleep_type ((sleep_type_t ) type);
252
+ bool ESP8266WiFiGenericClass::setSleepMode (WiFiSleepType_t type, uint8_t listenInterval) {
253
+
254
+ /* *
255
+ * datasheet:
256
+ *
257
+ wifi_set_sleep_level():
258
+ Set sleep level of modem sleep and light sleep
259
+ This configuration should be called before calling wifi_set_sleep_type
260
+ Modem-sleep and light sleep mode have minimum and maximum sleep levels.
261
+ - In minimum sleep level, station wakes up at every DTIM to receive
262
+ beacon. Broadcast data will not be lost because it is transmitted after
263
+ DTIM. However, it can not save much more power if DTIM period is short,
264
+ as specified in AP.
265
+ - In maximum sleep level, station wakes up at every listen interval to
266
+ receive beacon. Broadcast data may be lost because station may be in sleep
267
+ state at DTIM time. If listen interval is longer, more power will be saved, but
268
+ it’s very likely to lose more broadcast data.
269
+ - Default setting is minimum sleep level.
270
+ Further reading: https://routerguide.net/dtim-interval-period-best-setting/
271
+
272
+ wifi_set_listen_interval():
273
+ Set listen interval of maximum sleep level for modem sleep and light sleep
274
+ It only works when sleep level is set as MAX_SLEEP_T
275
+ It should be called following the order:
276
+ wifi_set_sleep_level(MAX_SLEEP_T)
277
+ wifi_set_listen_interval
278
+ wifi_set_sleep_type
279
+ forum: https://github.com/espressif/ESP8266_NONOS_SDK/issues/165#issuecomment-416121920
280
+ default value seems to be 3 (as recommended by https://routerguide.net/dtim-interval-period-best-setting/)
281
+ */
282
+
283
+ #ifdef DEBUG_ESP_WIFI
284
+ if (listenInterval && type == WIFI_NONE_SLEEP)
285
+ DEBUG_WIFI_GENERIC (" listenInterval not usable with WIFI_NONE_SLEEP\n " );
286
+ #endif
287
+
288
+ if (type == WIFI_LIGHT_SLEEP || type == WIFI_MODEM_SLEEP) {
289
+ if (listenInterval) {
290
+ if (!wifi_set_sleep_level (MAX_SLEEP_T)) {
291
+ DEBUG_WIFI_GENERIC (" wifi_set_sleep_level(MAX_SLEEP_T): error\n " );
292
+ return false ;
293
+ }
294
+ if (listenInterval > 10 ) {
295
+ DEBUG_WIFI_GENERIC (" listenInterval must be in [1..10]\n " );
296
+ #ifndef DEBUG_ESP_WIFI
297
+ // stay within datasheet range when not in debug mode
298
+ listenInterval = 10 ;
299
+ #endif
300
+ }
301
+ if (!wifi_set_listen_interval (listenInterval)) {
302
+ DEBUG_WIFI_GENERIC (" wifi_set_listen_interval(%d): error\n " , listenInterval);
303
+ return false ;
304
+ }
305
+ } else {
306
+ if (!wifi_set_sleep_level (MIN_SLEEP_T)) {
307
+ DEBUG_WIFI_GENERIC (" wifi_set_sleep_level(MIN_SLEEP_T): error\n " );
308
+ return false ;
309
+ }
310
+ }
311
+ }
312
+ bool ret = wifi_set_sleep_type ((sleep_type_t ) type);
313
+ if (!ret) {
314
+ DEBUG_WIFI_GENERIC (" wifi_set_sleep_type(%d): error\n " , (int )type);
315
+ }
316
+ return ret;
254
317
}
255
318
256
319
/* *
@@ -426,6 +489,22 @@ bool ESP8266WiFiGenericClass::forceSleepWake() {
426
489
return false ;
427
490
}
428
491
492
+ /* *
493
+ * Get listen interval of maximum sleep level for modem sleep and light sleep.
494
+ * @return interval
495
+ */
496
+ uint8_t ESP8266WiFiGenericClass::getListenInterval () {
497
+ return wifi_get_listen_interval ();
498
+ }
499
+
500
+ /* *
501
+ * Get sleep level of modem sleep and light sleep
502
+ * @return true if max level
503
+ */
504
+ bool ESP8266WiFiGenericClass::isSleepLevelMax () {
505
+ return wifi_get_sleep_level () == MAX_SLEEP_T;
506
+ }
507
+
429
508
430
509
// -----------------------------------------------------------------------------------------------------------------------
431
510
// ------------------------------------------------ Generic Network function ---------------------------------------------
0 commit comments