@@ -82,7 +82,7 @@ static std::list<WiFiEventHandler> sCbEventList;
8282bool ESP8266WiFiGenericClass::_persistent = true ;
8383WiFiMode_t ESP8266WiFiGenericClass::_forceSleepLastMode = WIFI_OFF;
8484
85- ESP8266WiFiGenericClass::ESP8266WiFiGenericClass ()
85+ ESP8266WiFiGenericClass::ESP8266WiFiGenericClass ()
8686{
8787 wifi_set_event_handler_cb ((wifi_event_handler_cb_t ) &ESP8266WiFiGenericClass::_eventCallback);
8888}
@@ -214,7 +214,7 @@ WiFiEventHandler ESP8266WiFiGenericClass::onSoftAPModeProbeRequestReceived(std::
214214 * callback for WiFi events
215215 * @param arg
216216 */
217- void ESP8266WiFiGenericClass::_eventCallback (void * arg)
217+ void ESP8266WiFiGenericClass::_eventCallback (void * arg)
218218{
219219 System_Event_t* event = reinterpret_cast <System_Event_t*>(arg);
220220 DEBUG_WIFI (" wifi evt: %d\n " , event->event );
@@ -249,8 +249,71 @@ int32_t ESP8266WiFiGenericClass::channel(void) {
249249 * @param type sleep_type_t
250250 * @return bool
251251 */
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;
254317}
255318
256319/* *
@@ -426,6 +489,22 @@ bool ESP8266WiFiGenericClass::forceSleepWake() {
426489 return false ;
427490}
428491
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+
429508
430509// -----------------------------------------------------------------------------------------------------------------------
431510// ------------------------------------------------ Generic Network function ---------------------------------------------
0 commit comments