flipper-rpc 0.9.5

Rust bindings and serial transport helpers for the Flipper Zero RPC protocol.
use std::sync::mpsc::channel;

use flipper_rpc::{
    error::Result,
    fs::{FsMetadata, FsRead, FsReadDir, FsRemove, FsWrite},
    transport::serial::{list_flipper_ports, rpc::SerialRpcTransport},
};
use std::time::Instant;

fn main() -> Result<()> {
    let ports = list_flipper_ports()?;

    let port = &ports[0].port_name;

    let mut cli = SerialRpcTransport::new(port)?;

    let (tx, rx) = channel();
    let data = (0..512 * 10).map(|i| (i / 512) as u8).collect::<Vec<_>>();
    let len = data.len();

    let handle = std::thread::spawn(move || {
        let start = Instant::now();
        for sent in rx {
            println!("[+{:.2?}] Progress: {}/{}", start.elapsed(), sent, len);
        }
    });

    cli.fs_write("/ext/file2.txt", data, Some(tx))?;

    handle.join().unwrap();

    println!("{:?}", cli.fs_metadata("/ext/file2.txt")?);
    println!("{:?}", cli.fs_read("/ext/file2.txt")?.len());
    println!(
        "{:?}",
        cli.fs_read_dir("/ext/subghz/Customer_Assistance_Buttons/Walgreens", true)?
            .collect::<Vec<_>>()
    );

    cli.fs_remove("/ext/file2.txt", false)?;

    Ok(())
}