The 0.9.14 release of Xous includes numerous quality-of-life improvements for Precursor users.
Improved performance of list filtering in vault by ~100x by refactoring the item cache to work on a Vec that is repeatedly sorted, instead of on a BTreeMap that is sorted once and then referenced as a shared object. Turns out that repeatedly sorting data is far cheaper than shared references or copying data to the heap (as a way to avoid shared references). See PR #389 for an in-depth analysis.
BIP39 support in plaintext passwords:
"Notes" fields that start with the keyword "bip39" will trigger a BIP39 password entry box (if the password field is blank), or a BIP39 rendering of the hex data.
The password generation prompt also uses a password of "bip39" to trigger the BIP39 generation sequence. That does mean you can't use just "bip39" as a password but... that's a bit short for a password anyways?
Added multi-line text editing to vault password fields, as well as left/right cursor movement to call up an insertion point that can be used to insert and delete characters in the middle of a field.
Added a "lefty mode" option for vault (flips the deny key from F1 to F4)
Added an "autotype delay" setting. The default is 30 ms, but some computers can't handle key strokes that fast (password characters may be intermittently dropped). A setting of 80 ms should be fine to deal with deeply virtualized USB stacks running on slower computers.
Fixed #325, u2f authentication requests now sunset even when the host stops polling
Added a menu option in vault to type usernames (in addition to passwords)
General UX Improvements
Community member @samblenny contributed a Tall font, and the rendering subsystem has been refactored to handle the larger 32-pixel sprites.
The default system font is now Tall, which should improve readability without sacrificing user prompts (i.e., dialog boxes should still fit on the screen).
Autosleep timer option added. By default it is 0 (disabled). It is adjustable in increments of minutes. Note that if you try to lock the device while plugged in, and then unplug it without unlocking it, the system will stay "awake" because it can't consult the PDDB to know what the autosleep setting is.
Autosleep can also optionally lock the device on sleep. However, by default it just sleeps.
The device will no longer try to suspend on lock if it is plugged in
Fixed a minor issue in precursorupdater where --config argument would not quit and run an update instead
Improved Wi-Fi scanning (fixes #336) - scans are now sorted by strength, old APs are retired, and the UX will pause while the scan occurs. Repeated scans still require going through the entire menu tree again; this is because modal radio-box lists aren't dynamically update-able.
Open Wi-Fi networks are now supported (#341) - requires EC update.
A proper TLS library for incorporation into apps that require it has been created by @nhoj. You can find it in libs/tls.
Kernel and CPU Improvements
Running gdb-stub on hardware is now quite reliable, thanks to some performance improvements by @xobs. Just remember that single stepping does not work on XIP images (and, by default now, apps are compiled as xip)
Extra characters added to arrow keys and Fn keys from MacOS hosted mode cleaned up (thanks @wizzard0)
#388 via @eupn adds physical address resolution for a remote virtual memory process, allowing for coordination with remote DMA initiators. Does introduce some potential security problems, so gated behind the v2p flag.
Fixed linkage between shellchat Wi-Fi API calls and status bar (#339)
Community member @jeandudey contributed #390 and #391 which improve the interoperability of svd2utra across build hosts and modularizes the language to the locales crate. Unused assembly code was also stripped out of xous-rs.
Rust 1.71.0 support - @xobs discovered that Rust 1.71.0 now shifts the address around of hardware management structures such that when we bind them to interrupt handlers, the final address of the interrupt handler is different from the address we see inside the new() function. It's actually allowed to do this. So, @xobs has created the "deferred-init + Box" pattern to harden against this. Deferred-init refers to binding the address of the hardware structure to the interrupt handler afternew() has returned. This ensures that at least all the optimizations that may happen inside new() are finalized. Additionally, wrapping the result of new() inside Box() ensures that the resulting structure is put on the heap. Because Box also implements Pin, the compiler won't muck with the address any further and should prevent future incompatibilities with Rust. The only place this pattern could not be applied is in the USB stack, because the USB crate we use expects to have an un-Box'd hardware management structure. However, deferred-init alone seems to be good enough, at least for now, to allow this to work.
Fixed (hopefully for real this time?) a bug in the "flush cache" instruction for Vex that affected specifically virtual memory configurations like ours. This will require an SoC update.
More Cramium SoC target integration and libraries; support multi-SVD targets in utralib. If you're curious as to what's in the pipeline and taking most of my time, you can follow along here. Hardware is hard!
Fix issue in ProcessStartup where repr(C) was missing, thanks to @vihaanjim for finding that subtle bug!
That’s it for this release. I was fairly happy to see that my daily-use Precursor hit over 700 hours of uptime before I updated it to this release.