radiorust 0.5.0

Software Defined Radio using the Tokio runtime
Documentation
use radiorust::prelude::*;

#[tokio::main]
async fn main() {
    let keyer = blocks::morse::Keyer::with_message(
        4096,
        48000.0,
        blocks::morse::Speed::from_paris_wpm(16.0),
        "VVV",
    )
    .unwrap();
    let limiter = blocks::filters::SlewRateLimiter::new(100.0);
    limiter.feed_from(&keyer);
    let filter = blocks::Filter::new(|_, freq| {
        if freq.abs() <= 100.0 {
            Complex::from(1.0)
        } else {
            Complex::from(0.0)
        }
    });
    filter.feed_from(&limiter);
    let volume = blocks::GainControl::new(0.5);
    volume.feed_from(&filter);
    let audio_mod = blocks::FreqShifter::with_shift(700.0);
    audio_mod.feed_from(&volume);
    let playback = blocks::io::audio::cpal::AudioPlayer::new(48000.0, None).unwrap();
    playback.feed_from(&audio_mod);
    let mut rl = rustyline::Editor::<()>::new().unwrap();
    loop {
        match rl.readline("Enter morse message> ") {
            Ok(line) => {
                let line = line.trim();
                if line.is_empty() {
                    println!("Empty message, exiting.");
                    break;
                }
                if keyer.send(&line).is_err() {
                    println!("Invalid character!");
                }
            }
            Err(err) => {
                println!("Error: {err}");
                break;
            }
        }
    }
}