From 1c74d4e6b44519eccb4eb0ef721fa995e7e495f7 Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Sat, 24 Feb 2018 18:08:32 +0100 Subject: [PATCH] heapless strings --- Cargo.toml | 5 ++- examples/parse2.rs | 90 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 examples/parse2.rs diff --git a/Cargo.toml b/Cargo.toml index d2d7709..34f9260 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,10 @@ cortex-m-rtfm = "0.2.2" cortex-m = "0.3.1" rtfm-core = "0.1.0" cortex-m-semihosting = "0.2.0" -heapless = "0.2.0" + +[dependencies.heapless] +path = "../heapless" +#version = "0.2.0" [dependencies.cortex-m-debug] version = "0.1.0" diff --git a/examples/parse2.rs b/examples/parse2.rs new file mode 100644 index 0000000..794bc87 --- /dev/null +++ b/examples/parse2.rs @@ -0,0 +1,90 @@ +//! Example of parsing an &str +#![deny(unsafe_code)] +//#![deny(warnings)] +#![feature(proc_macro)] +#![feature(unsize)] +#![no_std] + +extern crate cortex_m_rtfm as rtfm; +extern crate f4; +extern crate heapless; + +#[macro_use] +extern crate cortex_m_debug; + +use rtfm::app; +use heapless::String; +use core::fmt::Write; +use core::marker::Unsize; + +// RTFM FRAMEWORK +app! { + device: f4::stm32f40x, + +} + +#[derive(Debug)] +enum Command { + Start, + Stop, + Freq(u32), +} + +fn f(s: &&str) -> bool { + !(s == &"") +} + +const LEN: usize = 16; + +fn parse<'a, A>(s: &str, err: &'a mut String<A>) -> Result<Command, &'a mut String<A>> +where + A: Unsize<[u8]>, +{ + //let mut iter = s.split(' ').filter(|c| !(c == &"")); + let mut iter = s.split(' ').filter(f); + + match iter.next() { + Some("Stop") => Ok(Command::Stop), + Some("Start") => Ok(Command::Start), + Some("Freq") => match iter.next() { + Some(fs) => { + if let Ok(f) = fs.parse::<u32>() { + Ok(Command::Freq(f)) + } else { + let _ = write!(err, "{}", fs); + Err(err) + } + } + let _ = write!(err, "No frequency"); + None => Err(err), + }, + Some(command) => { + let _ = write!(err, "{}", command); + Err(&mut err); + } + None => Err("No input"), + } +} + +fn init(_p: init::Peripherals) { + let mut err: String<[u8; LEN]> = String::new(); + + ipln!("init"); + ipln!("{:?}", parse("Start", &mut err)); // works + + ipln!("err {}", err); + // ipln!("{:?}", parse(" Start ")); // works with white spaces + // ipln!("{:?}", parse(" Freq 122 ")); // works with white spaces + ipln!("{:?}", parse(" Freq a122 ", &mut err)); // Invalid frequency + ipln!("err {}", err); + + // ipln!("{:?}", parse(" Freq ")); // No frequency + // ipln!("{:?}", parse("")); // No input +} + +fn idle() -> ! { + // Sleep + loop { + rtfm::wfi(); + } +} -- GitLab