All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- EspMdns::query crashes when no services are found #279
- OTA: get_running_slot was wrongly returning the boot slot
- Workaround issue 11921 in ESP IDF (new member of struct
wifi_scan_config_t
) - Make all conversions to CString fallible rather than panic-ing
- Bugfixes in HTTPD WS support: Allow calls with a zero-length buffer
- Added docstrings for wifi module (#262)
- MSRV 1.66
- Support for ESP IDF 5.0, 5.1 and 5.2 (master)
- Remove the
experimental
status from all formerly experimental features - Remove the
nightly
feature flag guard from allasyncify
modules as Rust GATs are stable now - Async and blocking APIs for
Wifi
,Eth
andEspNetif
that abstract away the ESP IDF system event loop (for easier initial configuration) - API breakage innetif
Eth
SPI driver rebased on top ofesp-idf-hal
'sSpiDeviceDriver
; it can now either borrow or own the SPI device driver (API breakage)Eth
driver now supports SPI bus sharing with other SPI devices (API breakage)NVS
- additional APIs that support the serde format of the ESP IDF NVS C codeSNTP
- new, callback APIlog
- support for setting target level per moduleOTA
- small API extensionsnetif
- compilation errors when PPP & SLIP support is enabled are addressed- HTTP client & server - various bugfixes
EspError::from_infallible
HTTP server:
- Compatibility with
embedded-svc
V0.24 - New function -
fn_handler
that addresses HRTB lifetime issues when converting a Fn closure to aHandler
instance - Remove
EspHttpFnTraversableChain
; it is not necessary, now that thefn_handler
function from above does exist
Rebase on top of esp-idf-sys
0.32:
- Retire any usages of
esp-idf-sys::c_types
in favor ofcore::ffi
- Remove the
cstr_core
dependency asCstr
andCString
are now part of Rust core - Remove casts from
usize
tou32
and back now thatesp-idf-sys
is compiled with--size_t-is-usize
enabled
Patch releases:
- Eth driver:
- SPI drivers now work with ESP IDF 5+
- DMA channel is now configurable
- Clippy fixes
Patch releases to fix compilation errors under no_std.
Release 0.43 is a backwards-incompatible release where almost all services were touched in one way or another.
The main themes of the 0.43 release are:
- Public API
- Separate the notions of using a "nightly" compiler (which is a precondition for all async support) from "experimental" features, which might or might not be async-related
- Expose access to the wrapped ESP IDF services / drivers
- Wifi & Eth: separate layer 2 (ethernet) from layer 3 (IP)
- Http client & server: implement the new traits from
embedded-svc
- Merge the
nvs_storage
module intonvs
- Support for the
embassy-time
crate by providing alarm implementation - Support for the
embassy-time
crate by providing timer queue implementation
In addition to implementing the embedded-svc
traits where possible, all services now have public API. While the public API loosely follows the APIs from embedded-svc
, it deviates where appropriate so that the native underlying ESP IDF service is better utilized.
These public APIs mean that the user is no longer required to depend on the embedded-svc
crate so as to consume the esp-idf-svc
services.
Consuming the services via the embedded-svc
traits is now only necessary when the user is targetting cross-platform portability of their application code.
All services now implement the Handle
trait which does provide a reference to the native underlying ESP IDF service or driver. This is useful when the Rust wrapper for the service does not expose a particular functionality, as in that case, users can still call the functionality by using the raw esp-idf-svc
bindings for the service.
The Wifi and Ethernet drivers are now split into two separate structures:
WifiDriver
/EthDriver
- these are layer 2 (Ethernet) drivers which follow all the conventions of the other drivers in theesp-idf-hal
crate, including the need to own or mutably borrow the actual petihperal (the Wifi modem peripheral or the RMII / SPI peripheral fromesp-idf-hal
). They are however part ofesp-idf-svc
as this is better aligned with their native ESP IDF counterparts, which actually do use/rely on certain ESP IDF services, like the event loop and NVS storage, which - being services - are also exposed as part ofesp-idf-svc
, and not as part ofesp-idf-hal
. These drivers implement theWifi
andEth
traits respectively, which were redesigned to not have any IP-related semantics. Users are allowed to use the Layer 2 drivers directly by providing their own custom RX callbacks, thus completely bypassing the ESP IDF LwIP IP & Netif layer (i.e. withsmoltcp
or other 3rd party IP stack)EspWifi
/EspEth
- these are layer 3 (IP) + layer 2 (Ethernet) services, which - on construction - are expected to own aWifiDriver
/EthDriver
- either by constructing it themselves, or by the user passing the driver. These services "glue" the ESP IDF IP & Netif layer (EspNetif
) with the ethernet layer provided by the drivers. These services also implement theWifi
/Eth
traits, as they are wrapping Layer 2 functionality anyway. The Layer 3 functionality (configuring the network interface as well as fetching IP-related information from the network interfaces) however uses custom methods on the services' themselves and is not (yet) abstracted usingembedded-svc
traits.
Additionally, the Wifi
and Eth
trait implementations now provide finer grained control over the behavior of their drivers / services in that users should explicitly call start
/stop
to start/stop the driver, as well as connect
/disconnect
(for the Wifi driver in STA mode) to connect to an access point. While this makes the driver configuration a bit more involved, these changes provide the necessary flexibility for some corner use cases:
- When the Wifi driver is used together with the
EspNow
ESP NOW service, there is no need to actuallyconnect
the driver at all, which is now possible - More complex connect/disconnect schemes can now be implemented by users, for roaming or for reacting in case the Wifi connection is lost
Subject says it all, so to say.
- The previous distinction of two separate modules was awkward and is thus removed
- The other notable change here is that the ESP IDF implementation actually only implements the
RawStorage
trait, which provides facilities for reading / writing blobs. It is up to the user to layer aStorage
implementation on top of theRawStorage
implementation, but the benefit of that is that user is in control of how their structures are serialized/deserialized into binary. To ease the layering, users may take advantage of theStorageImpl
structure fromembedded-svc
and only provide aSerde
trait implementation which abstracts away the concrete Rust SerDe implementation (i.e.serde-json
,postcard
, etc.)
esp-idf-svc
provides an implementation of embassy-time
's alarm interface (the Driver
trait), which is implemented in terms of the ESP IDF Timer service (also exposed in the timer
module of esp-idf-svc
).
To use this feature, users need to enable the embassy-time-driver
Cargo feature.
esp-idf-svc
does provide a custom embassy-time
Timer Queue implementation (also implemented in terms of the ESP IDF Timer service), even though in the meantime embassy-time
features a generic timer queue which works everywhere and can also be used. This custom timer queue does not rely on the alarms interface provided by the embassy-time
crate (see the previous section).
The one major difference between embassy-time
's generic timer queue, and the one provided by esp-idf-svc
is that the latter has a slightly lower latency in that it does support the CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD=y
ESP IDF configuration parameter. When this parameter is enabled, the esp-idf-svc
timer queue does not use the ESP IDF Timer Service dispatch task/thread and notifies the executor about due timers directly from the ISR routine. When this parameter is not enabled, the esp-idf-svc
timer queue has no benefits compared to the generic timer queue in embassy-time
.
NOTE:
- The
esp-idf-svc
timer queue should only be used with async executors that are ISR safe, in that they can be awoken from an ISR.edge-executor
is such an executor. embassy-executor
is currently NOT ISR safe, because it relies - for its synchronization - on thecritical-section
crate, yet the critical section implementation that thecritical-section
crate uses on top ofesp-idf-hal
is based on a FreeRTOS mutex, and NOT on a disable-all-interupts ISR-safe implementation (that is, unless the user has configured a more elaborate setup with their own critical section implementation). On the other hand,embassy-executor
has its own highly optimized timer queue which should probably be used anyway and is enabled by default- All other executors can just use the generic timer queue implementation which is built-in in the
embassy-time
crate
To use this feature, users need to enable the embassy-time-isr-queue
Cargo feature.