**Summary**
- Python 3.7+ only, for Python 2.7 builds use `v0.2.x` releases
- Requires `pc-ble-driver-py` v0.12.0+ (also py3.7+)
- Uses Nordic Connectivity firmware v4.1.1 which corresponds with Softdevice v5 API
- Images can be flashed to dev kits and nrf52840 using nRF Connect and the hex files provided by `pc-ble-driver-py`
- Should be mostly backwards compatible with v0.2.x, other than the above changes to dependent libraries and firmware
---
**Known changes which may affect codebases**
- `Scanner.scanning` field was replaced with a read-only property `Scanner.is_scanning`
- Parameter validation was added for Advertising interval, scan window/interval/timeout, and connection interval/timeout. Will raise `ValueError` exceptions when provided parameters are out of range
- With python3, converting from `bytes` to `str` (and vice-versa) requires an encoding format. By default the encoding scheme used is `utf-8` but can be set per-characteristic
- `peer.disconnect()` will now always return a Waitable object. Before it would return `None` if not connected. If `disconnect()` is called when the peer is not connected, it will return a Waitable object that expires immediately
---
**New Features (not a comprehensive list)**
- Driver now properly works with 2 devices simultaneously
- event callbacks can now be used in a `with` context so the handler can be deregistered at the end of the block
- Example usage [here](https://github.com/ThomasGerstenberg/blatann/blob/1f85c68cf6db84ba731a55d3d22b8c2eb0d2779b/tests/integrated/test_advertising_duration.py#L48)
- The `ScanFinishedWaitable` now provides a `scan_reports` iterable which can be used to iterate on advertising packets as they're seen in real-time
- Example usage [here](https://github.com/ThomasGerstenberg/blatann/blob/1f85c68cf6db84ba731a55d3d22b8c2eb0d2779b/blatann/examples/scanner.py#L20)
- the `Peer` object now exposes properties the active connection parameters and the configured preferred connection parameters
- the `Peripheral` object now exposes an `on_service_discovery_complete` event
- added `AdvertisingData.to_bytes()` to get the actual packet that will be advertised over the air