I redid the ESP8266 WString library to enable small string optimization
(SSO) a while back, and think it would be helpful even on the ESP32 with
its higher memory complement.
SSO avoids lots of tiny mallocs() on the heap which cause fragmentation
by using the memory in the class object itself to store the actual
string and only mallocing() for buffers that are larger than what can
fit in thie class object. Modern C++ std::string implementations have
this optimization as well, but since we're using Arduino strings we had
to roll our own.
* Converted EEPROM library to use nvs instead of partition. Removed eeprom partition from all partition table CSV files.
* Changed variable names, added some comments, formatting as per me-no-dev's requests
* Checks for memory on malloc
* Moved include nvs.h from header to code
* Reworked the extra example to make it more clear how to actually use the library and persist data
* Replaced ARDUINO_VARIANT with const char
* Fixed missing return value
* Added quotes around defined value in macro (Issue #2193)
* Change logging from Error to Verbose when not found and default available
* Move Enter and Exit logging to Verbose Level
* Refactored LOG_X() into log_x()
* Properly allocate string and remove warning
The former way generates the following warning:
ISO C++ forbids converting a string constant to 'char*'
This change makes a character array the size of the string with null ending. It's clearer and gets rid of the warning.
* Better way
Since this is technically immutable, the type should reflect this too.
* add opportunity for more than one retry to _uploadReadByte
* an alternative timeout-based method to making _uploadReadByte more resilient
* move timing variables in the correct scope
* implement and use client.getTimeout instead of hard-coded timeout in _uploadReadByte
* add missing return
* some refactoring to address respecting the timeout in a potentially deadlocked connection
* fix spelling in comment
* address review comments; move impl to cpp file for getTimeout, and remove local variable for currentMillis
* remove redundant cast
* need to check for timeout outside the inner while as well
* update WebUpdate example to print something in unexpected callback condition
* update log_e messages per review comments
If _handler is set, pbuf_free is not called. ~AsyncUDPPacket() calls pbuf_free once but only after calling pbuf_ref in it's constructor. The refcount never reaches zero and the memory allocated for pbuf is never released.
* overload Preferences.getBytes similar to nvs so you can get size of the array.
* Cleaner implentation, with a separate function to get length. Added an example
Currently WiFiClient::write is unable to send messages over 25Kb, because of the hard-coded retry limit of 10, that is getting decremented on every successful send. Since we cannot send more than 2*MTU bytes in one go, and have only 10 retries, write() is limited to approximately 25Kb. Technically it is not a bug, as it correctly returns the number of sent bytes and the caller can set up futher retries. But not all libs are aware of this behavior, for example, WebServer is not.
I suggest improving current behavior by resetting retry counter every time we had a successful write, so the limit of 10 retries will apply to Failed writes only, and will not apply to Successful writes. This will allow to write() blobs of arbitrary sizes.
* Added 2 ffat partition schemes for 4MB modules + improved descriptions.
Existing format options were unclear on how much spiffs you were
getting. Also add missing 1MB App/3MB Spiffs split.
This addresses https://github.com/espressif/arduino-esp32/issues/1799
This makes it very clear what each option gives you, and also adds 2 options
to get ffat on 4MB chips..
* Added link to ffat howto.
* Update boards.txt
Add menu items for ffat on mhetesp32minikit board.
* Add partition table.
* Added ffat partition for 4MB ESP32 Dev Module.
* Added comment about partitioning schemes.