moros 0.12.0

MOROS: Obscure Rust Operating System
Documentation
use crate::api::console::Style;
use crate::api::process::ExitCode;
use crate::api::fs;
use crate::api::syscall;

use alloc::string::ToString;

const SPEAKER: &'static str = "/dev/speaker";

fn start_sound(freq: f64) -> Result<(), ExitCode> {
    let buf = freq.to_string();
    if !fs::is_device(SPEAKER) || fs::write(SPEAKER, buf.as_bytes()).is_err() {
        error!("Could not write to '{}'", SPEAKER);
        Err(ExitCode::Failure)
    } else {
        Ok(())
    }
}

fn stop_sound() -> Result<(), ExitCode> {
    start_sound(0.0)
}

fn beep(freq: f64, len: f64) -> Result<(), ExitCode> {
    start_sound(freq)?;
    syscall::sleep(len);
    stop_sound()
}

pub fn main(args: &[&str]) -> Result<(), ExitCode> {
    let mut freq = 440.0;
    let mut len = 200.0;
    let mut i = 1;
    let n = args.len();
    while i < n {
        match args[i] {
            "-h" | "--help" => {
                return help();
            }
            "-f" | "--freq" => {
                if i + 1 < n {
                    i += 1;
                    if let Ok(value) = args[i].parse() {
                        freq = value;
                    } else {
                        error!("Could not parse freq");
                        return Err(ExitCode::Failure);
                    }
                } else {
                    error!("Missing freq");
                    return Err(ExitCode::UsageError);
                }
            }
            "-l" | "--len" => {
                if i + 1 < n {
                    i += 1;
                    if let Ok(value) = args[i].parse() {
                        len = value;
                    } else {
                        error!("Could not parse len");
                        return Err(ExitCode::Failure);
                    }
                } else {
                    error!("Missing len");
                    return Err(ExitCode::UsageError);
                }
            }
            _ => {}
        }
        i += 1;
    }

    beep(freq, len / 1000.0)
}

fn help() -> Result<(), ExitCode> {
    let csi_option = Style::color("aqua");
    let csi_title = Style::color("yellow");
    let csi_reset = Style::reset();
    println!(
        "{}Usage:{} beep {}<options>{1}",
        csi_title, csi_reset, csi_option
    );
    println!();
    println!("{}Options:{}", csi_title, csi_reset);
    println!(
        "  {0}-f{1}, {0}--freq <hertz>{1}          Tone frequency",
        csi_option, csi_reset
    );
    println!(
        "  {0}-l{1}, {0}--len <milliseconds>{1}    Tone length",
        csi_option, csi_reset
    );
    Ok(())
}