#![no_main]
#![no_std]
extern crate flipperzero_rt;
extern crate flipperzero_alloc;
extern crate alloc;
use core::{ffi::CStr, num::NonZeroUsize};
use flipperzero::{furi, println};
use flipperzero_rt::{entry, manifest};
use core::time::Duration as CoreDuration;
use furi::time::FuriDuration;
manifest!(name = "Stream buffer example");
entry!(main);
fn main(_args: Option<&CStr>) -> i32 {
let size = NonZeroUsize::new(1024).unwrap();
let trigger_level = 16;
let stream_buffer = furi::stream_buffer::StreamBuffer::new(size, trigger_level);
let (tx, rx) = stream_buffer.into_stream();
let stream_buffer = tx.as_stream_buffer();
assert_eq!(stream_buffer.spaces_available(), size.into());
assert_eq!(stream_buffer.bytes_available(), 0);
assert_eq!(tx.send(&[1, 2, 3, 4]), 4);
assert_eq!(stream_buffer.bytes_available(), 4);
let mut recv_buf = [0; 32];
assert_eq!(rx.recv(&mut recv_buf), 4);
assert_eq!(recv_buf[0..4], [1, 2, 3, 4]);
let tx_thread = furi::thread::spawn(move || {
furi::thread::sleep(CoreDuration::from_secs(2));
assert_eq!(tx.send(&[5; 20]), 20);
for i in 4..20 {
furi::thread::sleep(CoreDuration::from_millis(200));
tx.send(&[i as u8; 3]);
}
0
});
let rx_thread = furi::thread::spawn(move || {
let mut buf = [0; 32];
assert_eq!(rx.recv(&mut buf), 0);
assert_eq!(rx.recv_blocking(&mut buf), 20);
while rx.is_sender_alive() {
let n = rx.recv_with_timeout(&mut buf, FuriDuration::from_secs(2));
println!("got {} bytes: {:?}", n, buf[0..n]);
}
0
});
tx_thread.join();
rx_thread.join();
0
}