slint/internal/backends/mcu
Simon Hausmann 2d2eb70b51 Fix panic about multiple mutable borrows with the software renderer
When using repeaters - like in the slide puzzle - and during renderer a component
gets deleted, we call free_graphics_resources and try to free
the dirty rectangle list in the partial renderer cache. At that point the cache is
already mutably borrowed, which causes a panic.

As remedy, apply the mutable borrow more fine grained and not right when calling
render().
2022-06-10 08:38:34 +02:00
..
LICENSES Fix LICENSES symlinks 2022-02-09 17:05:47 +01:00
pico_st7789 Add MCU board config setup (#1006) 2022-03-03 13:31:40 +01:00
simulator [reorg]: Move the rendering backends into internal 2022-01-31 16:00:50 +01:00
stm32h735g stm32h735g: cleanup 2022-04-27 09:00:52 +02:00
build.rs WIP: STM32H735G support 2022-04-27 09:00:52 +02:00
Cargo.toml Move the software renderer to core 2022-06-04 13:40:50 +02:00
lib.rs Fix panic about multiple mutable borrows with the software renderer 2022-06-10 08:38:34 +02:00
pico_st7789.rs corelib: allow to use i32 for coordinate instead of f32 2022-04-11 17:46:50 +02:00
profiler.rs MCU: Refactor the renderer in a LineRenderer 2022-05-23 16:40:34 +02:00
README.md Fix instructions on how to build the mcu printer demo for the simulator 2022-05-16 08:29:33 +02:00
simulator.rs Fix panic about multiple mutable borrows with the software renderer 2022-06-10 08:38:34 +02:00
stm32h735g.rs stm32h735: cleanup after review 2022-04-27 09:00:52 +02:00

NOTE: This library is an internal crate of the Slint project. This crate should not be used directly by applications using Slint. You should use the slint crate instead.

WARNING: This crate does not follow the semver convention for versioning and can only be used with version = "=x.y.z" in Cargo.toml.

Slint MCU backend

The MCU backend is still a work in progress.

We currently have in-tree backend for

  • the Raspberry Pi Pico and ST7789 based screen:

    The Raspberry Pi Pico uses a RP2040 micro-controller which has 264KB of RAM and 2MB of flash memory.

  • STM32H735G-DK

  • Simulator, which is a way to test the software rendering backend on desktop.

We will make some backend API public so any board supported by rust can easily be supported

How to use

In order to use this backend, the final program must depend on both slint and i_slint_backend_mcu. The main.rs will look something like this

#![no_std]
#![cfg_attr(not(feature = "simulator"), no_main)]
slint::include_modules!();

#[i_slint_backend_mcu::entry]
fn main() -> ! {
    i_slint_backend_mcu::init();
    MainWindow::new().run();
    panic!("The event loop should not return");
}

Since i_slint_backend_mcu is at the moment an internal crate not uploaded to crates.io, you must use the git version of slint, slint-build, and i_slint_backend_mcu

[dependencies]
slint = { git = "https://github.com/slint-ui/slint" }
i_slint_backend_mcu = { git = "https://github.com/slint-ui/slint" }
# ...
[build-dependencies]
slint-build = { git = "https://github.com/slint-ui/slint" }

Run the demo:

The simulator

cargo run -p printerdemo_mcu --features=mcu-simulator --release

On the Raspberry Pi Pico

You need nightly rust because that's the only way to get an allocator.

Build the demo with:

cargo +nightly build -p printerdemo_mcu --features=mcu-pico-st7789 --target=thumbv6m-none-eabi --release

You should process the file with elf2uf2-rs

cargo install elf2uf2-rs
elf2uf2-rs target/thumbv6m-none-eabi/release/printerdemo_mcu

Then upload the demo to the raspberry pi: push the "bootsel" white button on the device while connecting the micro-usb cable to the device, this connect some storage where you can store the binary.

Or from the command on linux: (connect the device while pressing the "bootsel" button.

# mount the device
udisksctl mount -b /dev/sda1
# upload
elf2uf2-rs -d target/thumbv6m-none-eabi/release/printerdemo_mcu

Using probe-run

This require probe-run (cargo install probe-run) and to connect the pico via a probe (for example another pico running the probe)

Then you can simply run with cargo run

CARGO_TARGET_THUMBV6M_NONE_EABI_LINKER="flip-link" CARGO_TARGET_THUMBV6M_NONE_EABI_RUNNER="probe-run --chip RP2040" cargo +nightly run -p printerdemo_mcu --features=mcu-pico-st7789 --target=thumbv6m-none-eabi --release

STM32H735G-DK

Using probe-run (cargo install probe-run)

CARGO_TARGET_THUMBV7EM_NONE_EABIHF_RUNNER="probe-run --chip STM32H735IGKx" cargo +nightly run -p printerdemo_mcu --features=i-slint-backend-mcu/stm32h735g --target=thumbv7em-none-eabihf --release