Description
Arduino IDE 1.8.3
arduinoWebsockets 2.0.9 {
modified thus:
//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266
#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC
//#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100
}
ESP AsyncTCP 1.0.0
I have a sound sensor on pin 4 which sends text "4,0" or "4,1" to the websocket (using broadcastTXT) when it changes state. When the sensitivity is set very low, everything works fine. When the sensitivity is high and there is a lot of background noise (or music) the pin toggles very rapidly and thus dozens of websocket messages are sent every second. When this is the case, I get websocket errors:
Version 2.0.9 causes a WDT reset (see later)
If I revert the library to v2.0.7, I never get the WDT reset, but I get a socket error ( apparenly at random)
esp.js:24 WebSocket connection to 'ws://192.168.1.110:81/pin' failed: Could not decode a text frame as UTF-8.
Of course, I realise this could be a timing erro in my (very complex!) code - but it strikes me as off that the two libraries give two different outcomes...
Unfortunately my code is contained in 4 libraries, containing well over 1000 lines of code, so it's not practical to post it here, but I will try to give some background:
It contains a scheduler to serialise all asynchronous events thus the pin change "event" is called from the main loop thread and not from an interrupt. The broadcastTXT() calls thus also descend from the main loop on all cases. and is always followed by a call to loop().
To reiterate - this only occurs when extremely rapid successive calls are made - unfortunately I have no metrics but 10-15 per sec seems fine
Version 2.0.9 WDT reset:
0x4021cde8: umm_free_heap_size at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1739
0x401054c8: ets_timer_arm_new at ?? line ?
0x40201908: xPortGetFreeHeapSize at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/heap.c line 38
0x40233729: system_get_free_heap_size at ?? line ?
0x4021445c: EspClass::getFreeHeap() at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/Esp.cpp line 499
0x4020fe54: AsyncTCPbuffer::_sendBuffer() at C:\Users\phil\Documents\Arduino\libraries\ESPAsyncTCP\src/ESPAsyncTCPbuffer.cpp line 267
0x4020ffab: AsyncTCPbuffer::write(unsigned char const*, unsigned int) at C:\Users\phil\Documents\Arduino\libraries\ESPAsyncTCP\src/ESPAsyncTCPbuffer.cpp line 267
0x402116f4: H4::_queueFn(smartTicker*) at C:\Users\phil\Documents\Arduino\libraries\H4\src/H4.cpp line
5598
81
0x4020e04d: WebSockets::write(WSclient_t*, unsigned char*, unsigned int) at C:\Users\phil\Documents\Arduino\libraries\WebSockets\src/WebSockets.cpp line 648
0x40233729: system_get_free_heap_size at ?? line ?
0x4021445c: EspClass::getFreeHeap() at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/Esp.cpp line 499
0x4020de18: WebSockets::sendFrame(WSclient_t*, WSopcode_t, unsigned char*, unsigned int, bool, bool, bool) at C:\Users\phil\Documents\Arduino\libraries\WebSockets\src/WebSockets.cpp line 648
0x40107bad: sprintf at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/libc_replacements.c line 342
0x4020ea3c: WebSocketsServer::broadcastTXT(unsigned char*, unsigned int, bool) at C:\Users\phil\Documents\Arduino\libraries\WebSockets\src/WebSocketsServer.cpp line 151
0x4010020c: _umm_free at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1287
0x4010068c: free at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1733
0x4020ea68: WebSocketsServer::broadcastTXT(char*, unsigned int, bool) at C:\Users\phil\Documents\Arduino\libraries\WebSockets\src/WebSocketsServer.cpp line 151
0x40207b61: ESPArto::_pinChange(int, int) at C:\Users\phil\Documents\Arduino\libraries\ESPArto\src/ESPArto.cpp line 175
0x402105e5: SmartPins::spRetriggering::raw(int) at C:\Users\phil\Documents\Arduino\libraries\smartPins\src/SmartPins.h line 154
0x40217719: std::_Function_handler (ESPArto*, std::_Placeholder1>, std::_Placeholder2>)> >::_M_invoke(std::_Any_data const&, int, int) at C:\Users\phil\Documents\Arduino\libraries\ESPArto\src/ESPArto.cpp line 175
0x402104ec: std::_Function_base::_Base_manager , SmartPins*)::{lambda(SmartPins::spRetriggering*)#1} (SmartPins::spRetriggering*)> >::_M_manager(std::_Any_data&, std::_Function_base::_Base_manager , SmartPins*)::{lambda(SmartPins::spRetriggering*)#1} (SmartPins::spRetriggering*)> > const&, std::_Manager_operation) at C:\Users\phil\Documents\Arduino\libraries\smartPins\src/SmartPins.h line 154
0x402107fe: std::function ::operator()(int, int) const at C:\Users\phil\Documents\Arduino\libraries\smartPins\src/SmartPins.h line 154
0x40210848: SmartPins::hwPin::run() at C:\Users\phil\Documents\Arduino\libraries\smartPins\src/SmartPins.h line 154
0x40210e33: SmartPins::loop() at C:\Users\phil\Documents\Arduino\libraries\smartPins\src/SmartPins.h line 154
0x402080b7: ESPArto::loop() at C:\Users\phil\Documents\Arduino\libraries\ESPArto\src/ESPArto.cpp line 175
0x40207fb1: loop at C:\Users\phil\Documents\Arduino\libraries\ESPArto\src/ESPArto.cpp line 175
0x402165e0: loop_wrapper at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_main.cpp line 56
0x40100768: cont_norm at C:\Users\phil\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/cont.S line 109