Skip to content

Commit

Permalink
Implement std::thread-like wrappers around Furi Thread APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
str4d committed May 4, 2023
1 parent aa1bfde commit 7156b33
Show file tree
Hide file tree
Showing 5 changed files with 442 additions and 3 deletions.
4 changes: 4 additions & 0 deletions crates/flipperzero/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,7 @@ harness = false
[[example]]
name = "dialog"
required-features = ["alloc"]

[[example]]
name = "threads"
required-features = ["alloc"]
69 changes: 69 additions & 0 deletions crates/flipperzero/examples/threads.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
//! Demonstrates use of threads on the Flipper Zero.
#![no_main]
#![no_std]

// Required for panic handler
extern crate flipperzero_rt;

// Required for allocator
extern crate flipperzero_alloc;

extern crate alloc;

use alloc::borrow::ToOwned;
use core::time::Duration;

use flipperzero::{furi::thread, println};
use flipperzero_rt::{entry, manifest};

// Define the FAP Manifest for this application
manifest!(name = "Threads example");

// Define the entry function
entry!(main);

// Entry point
fn main(_args: *mut u8) -> i32 {
println!("Main app started!");

let first = thread::spawn(|| {
println!("First thread started!");
thread::sleep(Duration::from_secs(5));
println!("First thread finished!");
0
});

thread::sleep(Duration::from_secs(1));

let second = thread::Builder::new()
.name("Flipper".to_owned())
.expect("name is valid")
.spawn(|| {
println!("Second thread started!");
thread::sleep(Duration::from_secs(2));
println!("Second thread finished!");
0
});

for (i, thread) in [&thread::current(), first.thread(), second.thread()]
.into_iter()
.enumerate()
{
if let Some(name) = thread.name() {
println!("Running thread {} ({})", i, name);
} else {
println!("Running unnamed thread {}", i);
}
}

// We can either drop the `JoinHandle` and let the thread complete in the background,
// or we can join the thread which blocks until its completion. Because `first` will
// outlive this `main` function, the app will block just after `main` returns until
// the thread completes.
drop(first);
second.join();

println!("Main app finished!");
0
}
Loading

0 comments on commit 7156b33

Please sign in to comment.